根据另一列值从一列中创建行

时间:2017-03-06 20:47:07

标签: r dataframe

我有一个像这样的数据框

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

3 个答案:

答案 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