按R中的变量将行重塑为列表
我有一个如下所示的数据框:按R中的变量将行重塑为列表,r,dplyr,data.table,reshape,R,Dplyr,Data.table,Reshape,我有一个如下所示的数据框: class id 1 foo 1 2 bar 1 3 baz 1 4 baz 2 5 bar 2 6 foo 2 7 foo 3 8 foo 3 9 foo 3 我的目标是将其重塑为一个数据框架,按照给定的顺序将类收集到一个列表中。例如,输出如下所示: > output id var1 var2 var3 1 1 foo bar baz 2 2 baz bar foo 3 3 f
class id
1 foo 1
2 bar 1
3 baz 1
4 baz 2
5 bar 2
6 foo 2
7 foo 3
8 foo 3
9 foo 3
我的目标是将其重塑为一个数据框架,按照给定的顺序将类收集到一个列表中。例如,输出如下所示:
> output
id var1 var2 var3
1 1 foo bar baz
2 2 baz bar foo
3 3 foo foo foo
或者,一个两列数据框,第一列包含id,第二列依次包含id
变量列表
我尝试过使用重塑库中的dcast(test,id~class)
,但这并没有返回我需要的输出
有没有关于如何在R中实现这一点的想法?以下是数据:
dput(test)
structure(list(class = c("foo", "bar", "baz", "baz", "bar", "foo",
"foo", "foo", "foo"), id = c(1, 1, 1, 2, 2, 2, 3, 3, 3)), row.names = c(NA,
-9L), class = "data.frame")
我们通过“id”创建一个序列列,然后使用
spread
library(tidyverse)
test %>%
group_by(id) %>%
mutate(rn = str_c("var", row_number())) %>%
spread(rn, class)
# A tibble: 3 x 4
# Groups: id [3]
# id var1 var2 var3
# <dbl> <chr> <chr> <chr>
#1 1 foo bar baz
#2 2 baz bar foo
#3 3 foo foo foo
或
或者使用
data.table
,使用rowid
和dcast
library(data.table)
dcast(setDT(test), id ~ paste0("var", rowid(id)), value.var = 'class')
# id var1 var2 var3
#1: 1 foo bar baz
#2: 2 baz bar foo
#3: 3 foo foo foo
如果我们想使用
base R
,一个选项是ave
和重塑
reshape(transform(test, rn = paste0("var", ave(seq_along(id), id,
FUN = seq_along))), idvar = 'id', direction = 'wide', timevar = 'rn')
注意:当重复次数不相等时,所有方法都有效您可以通过
id
和cbind
感兴趣的列拆分数据帧
data.frame(id=unique(d$id), t(do.call(cbind, split(d$class, d$id))))
# id X1 X2 X3
# 1 1 foo bar baz
# 2 2 baz bar foo
# 3 3 foo foo foo
注意:如果不需要系数,请使用cbind.data.frame
数据
d
reshape(transform(test, rn = paste0("var", ave(seq_along(id), id,
FUN = seq_along))), idvar = 'id', direction = 'wide', timevar = 'rn')
data.frame(id=unique(d$id), t(do.call(cbind, split(d$class, d$id))))
# id X1 X2 X3
# 1 1 foo bar baz
# 2 2 baz bar foo
# 3 3 foo foo foo
d <- structure(list(class = c("foo", "bar", "baz", "baz", "bar", "foo",
"foo", "foo", "foo"), id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L,
3L)), row.names = c(NA, -9L), class = "data.frame")