我有一个像这样的数据框
V1 V2
10 5
20 4
30 8
40 6
10 10
20 7
30 4
40 9
我希望将所有与相同V1相关的值放在一行中,如此......
V1 V2 V3
10 5 10
20 4 7
30 8 4
40 6 9
答案 0 :(得分:1)
这是基础R中的解决方案。您可以将行V1中的唯一数据馈送到lapply中,并为V2中的每个唯一V1提取所有值。这是你用rbind调用do.call(因为lapply的结果是一个列表),然后你通过cbind将得到的矩阵与uniques的向量合并。
# Create df1 for demonstration
df1 = data.frame(a = rep(1:4, 10), b = sample(1:40))
output = cbind(unique(df1$a), do.call(rbind, lapply(unique(df1$a), function(x) df1$b[df1$a == x])))
此解决方案取决于源数据框内的值是否为相同类型。如果不是,您可能需要投入一些时间将数据转换为正确的类型。但这应该不是问题。
答案 1 :(得分:0)
您可以使用应用功能执行所需操作。
DF <- data.frame(A = c(1:5,1:5),B=11:20)
lst <- lapply(unique(DF$A),function(AA) DF[DF$A ==AA,'B'])
Result <- do.call(rbind,lst)
如果您希望重新使用A列,可以使用Results <- cbind(A=names(lst),Results)
小心,这会给你一个矩阵而不是data.frame。如果您的值不是此示例中的数字,则可能会导致某些问题。
使用数据表或dplyr可以使用其他方法。
答案 2 :(得分:0)
我们可以使用dcast
data.table
执行此操作
library(data.table)
dcast(setDT(df1), V1~paste0("V", rowid(V1)+1))
# V1 V2 V3
#1: 10 5 10
#2: 20 4 7
#3: 30 8 4
#4: 40 6 9