gpt4 book ai didi

R如何通过创建新列在一行中写入可变数量的具有相同属性的行

转载 作者:行者123 更新时间:2023-12-01 23:56:16 24 4
gpt4 key购买 nike

我有一个由大约 7.000 行组成的巨大数据框,每行都有一个特定的 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 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

现在我想以具有相同 ID 的属性写在一行中的方式形成我的 data.frame,这样我(在这种情况下)最多有 4 列用于var1 和 4 列用于 var2,因为最常见的 ID 出现了四次 (ID a)。所有其他不存在数据的空间都应该用 .

生成的 data.frame 应该如下所示:

    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

我的想法是通过 tapply 解决这个问题

df2 <- tapply (df$var1,df$ID,paste)

这给了我以下输出:

$a
[1] "10" "20" "10" "40"
$b
[1] "30"
$c
[1] "20" "20"
$d
[1] "10" "10" "40"

如果我将其转换为数据框,它看起来像这样:

> df3 <-as.data.frame(df2)  
> df3

df3
a 10, 20, 10, 40
b 30
c 20, 20
d 10, 10, 40

问题是我现在只有一个变量,而不是所需的四个。 (或者实际上是八个,关于那些由 var2 产生的结果,我会像 var1 一样处理它们,并在最后一步通过合并合并)。

然后我尝试了 strsplit() 但这并不能帮助我解决问题,因为我没有得到不同的列并且我不知道如何添加 NA 值。

也许有一个简单的函数来重构data.frame?如果有人能帮助我,我会很幸运。

最佳答案

添加辅助 ID 并使用 reshape:

这是我们的第二个 ID 应该是这样的(实际上,这通常被称为您的“时间”变量)

with(df, ave(rep(1, nrow(df)), ID, FUN = seq_along))
# [1] 1 2 3 4 1 1 2 1 2 3

有了这个,基础 R 的未被充分认识的 reshape 可以轻松解决这个问题:

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

或者,使用“reshape2”:

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

关于R如何通过创建新列在一行中写入可变数量的具有相同属性的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23563753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com