将信息从行转换为新列

时间:2019-05-08 07:37:23

标签: r

R中是否有一种方法可以将列"V"(下面)中的每三个值放到新列中?换句话说,我需要将数据从长到宽的形状进行重塑,但是只能重整到三列,并且这些值就是第五列中显示的值。下面是一个演示。

提前谢谢!

enter image description here

enter image description here

data = structure(list(Key = c(200, 200, 200, 200, 200, 200, 300, 300, 
                300, 300, 300, 300, 400, 400, 400, 400, 400, 400), 
                V = c("a", "b", "c", "b", "d", "c", "d", "b", "c", "a", "f", "c", "d", "b", 
                "c", "a", "b", "c")), 
                row.names = c(NA, 18L), 
                class = "data.frame")

1 个答案:

答案 0 :(得分:1)

这是一个选择

data %>%
    group_by(Key) %>%
    mutate(
        grp = gl(n() / 3, 3),
        col = c("x", "y", "z")[(row_number() + 2) %% 3 + 1]) %>%
    group_by(Key, grp) %>%
    spread(col, V) %>%
    ungroup() %>%
    select(-grp)
## A tibble: 6 x 4
#    Key x     y     z
#  <dbl> <chr> <chr> <chr>
#1   200 a     b     c
#2   200 b     d     c
#3   300 d     b     c
#4   300 a     f     c
#5   400 d     b     c
#6   400 a     b     c

注意:这假设每个Key的条目数可被3整除。

您也可以使用grp = gl(n() / 3, 3)代替grp = rep(1:(n() / 3), each = 3)


更新

为回应您的评论,让我们通过从data中删除一些行来创建示例数据,以使对于Key = 200Key = 300,我们没有3 {{1}的倍数。 }条目。

V

那我们就可以做

data2 <- data %>% slice(-c(1, 8))

请注意如何用data2 %>% group_by(Key) %>% mutate(grp = gl(ceiling(n() / 3), 3)[1:n()]) %>% group_by(Key, grp) %>% mutate(col = c("x", "y", "z")[1:n()]) %>% spread(col, V) %>% ungroup() %>% select(-grp) ## A tibble: 6 x 4 # Key x y z # <dbl> <chr> <chr> <chr> #1 200 b c b #2 200 d c NA #3 300 d c a #4 300 f c NA #5 400 d b c #6 400 a b c 填充“缺失”值。