R如何通过创建新列在一行中写入具有相同属性的可变行数
我有一个巨大的数据帧,由大约7000行组成,每行有一个特定的ID号,可以出现多次(最多16次)。在一个简单的版本中,它如下所示:R如何通过创建新列在一行中写入具有相同属性的可变行数,r,reshape,R,Reshape,我有一个巨大的数据帧,由大约7000行组成,每行有一个特定的ID号,可以出现多次(最多16次)。在一个简单的版本中,它如下所示: ID <- factor(c("a","a","a","a","b","c","c","d","d","d")) var1 <-c(10,20,10,40,30,20,20,10,10,40) var2 <-c(5,5,4,8,9,2,4,7,1,3) df <- data.frame(ID,var1,var2) df ID var1
ID <- factor(c("a","a","a","a","b","c","c","d","d","d"))
var1 <-c(10,20,10,40,30,20,20,10,10,40)
var2 <-c(5,5,4,8,9,2,4,7,1,3)
df <- data.frame(ID,var1,var2)
df
ID var1 var2
1 a 10 5
2 a 20 5
3 a 10 4
4 a 40 8
5 b 30 9
6 c 20 2
7 c 20 4
8 d 10 7
9 d 10 1
10 d 40 3
我的想法是通过tapply
df2 <- tapply (df$var1,df$ID,paste)
如果我将其转换为数据帧,它如下所示:
ID var1_1 var1_2 var1_3 var1_4 var2_1 var2_2 var2_3 var2_4
1 a 10 20 10 40 5 5 4 8
2 b 30 NA NA NA 9 NA NA NA
3 c 20 20 NA NA 2 4 NA NA
4 d 10 10 40 NA 7 1 3 NA
> df3 <-as.data.frame(df2)
> df3
df3
a 10, 20, 10, 40
b 30
c 20, 20
d 10, 10, 40
>df3 df3
df3
a 10,20,10,40
b 30
c 20,20
d 10、10、40
问题是我现在只有一个变量,而不是期望的四个。(或者实际上是八个,关于由var2产生的那些,我会像var1一样处理它们,并在最后一步通过merge进行组合)
然后我尝试了strsplit()
,但这无助于解决问题,因为我没有得到不同的列,也不知道如何添加NA值
也许有一个简单的函数可以重构
data.frame
?如果有人能帮助我,我将非常幸运。添加一个辅助ID并使用重塑
:
下面是我们的第二个ID应该是什么样子(实际上,这通常被称为“时间”变量)
有了这些,base R被低估的重塑
轻松解决了这一问题:
df$ID2 <- with(df, ave(rep(1, nrow(df)), ID, FUN = seq_along))
reshape(df, direction = "wide", idvar="ID", timevar="ID2")
# ID var1.1 var2.1 var1.2 var2.2 var1.3 var2.3 var1.4 var2.4
# 1 a 10 5 20 5 10 4 40 8
# 5 b 30 9 NA NA NA NA NA NA
# 6 c 20 2 20 4 NA NA NA NA
# 8 d 10 7 10 1 40 3 NA NA
df$ID2ncolVar1您是否检查了restrape
-功能(stats
-包)?忍者版由Rob编写,但我还打算建议restrape
+1回答一个可重复的问题,展示您尝试过的内容以及您希望看到的内容。非常感谢您的帮助!:)
with(df, ave(rep(1, nrow(df)), ID, FUN = seq_along))
# [1] 1 2 3 4 1 1 2 1 2 3
df$ID2 <- with(df, ave(rep(1, nrow(df)), ID, FUN = seq_along))
reshape(df, direction = "wide", idvar="ID", timevar="ID2")
# ID var1.1 var2.1 var1.2 var2.2 var1.3 var2.3 var1.4 var2.4
# 1 a 10 5 20 5 10 4 40 8
# 5 b 30 9 NA NA NA NA NA NA
# 6 c 20 2 20 4 NA NA NA NA
# 8 d 10 7 10 1 40 3 NA NA
library(reshape2)
df$ID2 <- with(df, ave(rep(1, nrow(df)), ID, FUN = seq_along))
dfL <- melt(df, id.vars=c("ID", "ID2"))
dcast(dfL, ID ~ variable + ID2, value.var="value")
# ID var1_1 var1_2 var1_3 var1_4 var2_1 var2_2 var2_3 var2_4
# 1 a 10 20 10 40 5 5 4 8
# 2 b 30 NA NA NA 9 NA NA NA
# 3 c 20 20 NA NA 2 4 NA NA
# 4 d 10 10 40 NA 7 1 3 NA
ncolVar1 <- max(rowSums(table(ID, var1)))
ncolVar2 <- max(rowSums(table(ID, var2)))
fun <- function(x, maxcol) {ifelse(length(x)==maxcol, list(x), list(c(x, rep(NA, maxcol-length(x)))))}
cbind(do.call(rbind, tapply(var1, ID, fun, ncolVar1)), do.call(rbind, tapply(var2, ID, fun, ncolVar2)))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# a 10 20 10 40 5 5 4 8
# b 30 NA NA NA 9 NA NA NA
# c 20 20 NA NA 2 4 NA NA
# d 10 10 40 NA 7 1 3 NA