R中是否有一种方法可以将列"V"
(下面)中的每三个值放到新列中?换句话说,我需要将数据从长到宽的形状进行重塑,但是只能重整到三列,并且这些值就是第五列中显示的值。下面是一个演示。
提前谢谢!
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")
答案 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 = 200
和Key = 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
填充“缺失”值。