按 id 将行聚合到多个列中,其中每个 id 的行数不同 (R)
aggregating rows by id into multiple columns where number of rows per id varies (R)
我的问题由于重复而被关闭,因为我没有很好地解释自己。这就是阻碍我使用 dplyr 的 gather-unite-spread 的问题。通常这是一项简单的任务,但有一些问题使得使用此数据集实现起来有些困难。
我有以下数据集
ID V.1 V.2 V.3 V.4
1 x y Z 0
1 x y Z 0
1 x y Z 0
1 x y Z 1
2 x y Z 0
2 x y Z 1
3 x y Z 0
3 x y Z 1
数据集需要如下所示
ID V.1a V.2a V.3a V.1b V.2b V.3b V.1c V.2c V.3c V.1d V.2d V.3d V.4
1 x y z x y z x y z x y z 4
2 x y z x y z na na na na na na 2
3 x y z x y z na na na na na na 2
问题 - 每个唯一 ID 的行数不同
这似乎是我最大的问题。这导致列数不均匀,并使我通常的聚合方式不起作用。
如有任何帮助,我们将不胜感激。
这里有一个使用data.table
的方法
library(data.table)
setDT(dat)
out <- dcast(dat, ID ~ rowid(ID), value.var = c("V.1", "V.2", "V.3"))[
dat[, .('V.4' = length(V.4)), by = ID], on = "ID"
]
out
# ID V.1_1 V.1_2 V.1_3 V.1_4 V.2_1 V.2_2 V.2_3 V.2_4 V.3_1 V.3_2 V.3_3 V.3_4 V.4
#1: 1 x x x x y y y y Z Z Z Z 4
#2: 2 x x <NA> <NA> y y <NA> <NA> Z Z <NA> <NA> 2
#3: 3 x x <NA> <NA> y y <NA> <NA> Z Z <NA> <NA> 2
我们使用 dcast
将列 V.1
从长到宽扩展到 V.3
,然后将结果连接到 dat[, .('V.4' = length(V.4)), by = ID]
,后者只是聚合列 V.4
。
如果您想继续使用 data.frame
,请使用 setDF(out)
。
数据
dat <- read.table(text = 'ID V.1 V.2 V.3 V.4
1 x y Z 0
1 x y Z 0
1 x y Z 0
1 x y Z 1
2 x y Z 0
2 x y Z 1
3 x y Z 0
3 x y Z 1',
header = TRUE, stringsAsFactors = FALSE)
我的问题由于重复而被关闭,因为我没有很好地解释自己。这就是阻碍我使用 dplyr 的 gather-unite-spread 的问题。通常这是一项简单的任务,但有一些问题使得使用此数据集实现起来有些困难。
我有以下数据集
ID V.1 V.2 V.3 V.4
1 x y Z 0
1 x y Z 0
1 x y Z 0
1 x y Z 1
2 x y Z 0
2 x y Z 1
3 x y Z 0
3 x y Z 1
数据集需要如下所示
ID V.1a V.2a V.3a V.1b V.2b V.3b V.1c V.2c V.3c V.1d V.2d V.3d V.4
1 x y z x y z x y z x y z 4
2 x y z x y z na na na na na na 2
3 x y z x y z na na na na na na 2
问题 - 每个唯一 ID 的行数不同
这似乎是我最大的问题。这导致列数不均匀,并使我通常的聚合方式不起作用。
如有任何帮助,我们将不胜感激。
这里有一个使用data.table
library(data.table)
setDT(dat)
out <- dcast(dat, ID ~ rowid(ID), value.var = c("V.1", "V.2", "V.3"))[
dat[, .('V.4' = length(V.4)), by = ID], on = "ID"
]
out
# ID V.1_1 V.1_2 V.1_3 V.1_4 V.2_1 V.2_2 V.2_3 V.2_4 V.3_1 V.3_2 V.3_3 V.3_4 V.4
#1: 1 x x x x y y y y Z Z Z Z 4
#2: 2 x x <NA> <NA> y y <NA> <NA> Z Z <NA> <NA> 2
#3: 3 x x <NA> <NA> y y <NA> <NA> Z Z <NA> <NA> 2
我们使用 dcast
将列 V.1
从长到宽扩展到 V.3
,然后将结果连接到 dat[, .('V.4' = length(V.4)), by = ID]
,后者只是聚合列 V.4
。
如果您想继续使用 data.frame
,请使用 setDF(out)
。
数据
dat <- read.table(text = 'ID V.1 V.2 V.3 V.4
1 x y Z 0
1 x y Z 0
1 x y Z 0
1 x y Z 1
2 x y Z 0
2 x y Z 1
3 x y Z 0
3 x y Z 1',
header = TRUE, stringsAsFactors = FALSE)