如何拆分一个数据框并将拆分的部分附加到新列中?

3
我想通过更改第一列的值来拆分数据框,并将已拆分部分附加在新列中。下面给出了一个示例。但是,我最终得到了一个列表,无法将其处理回便捷的数据框。
期望的输出应该像`df_goal`一样,但尚未正确格式化。
#data

x <-c(1,2,3)
y <-c(20200101,20200101,20200101)
z <-c(4.5,5,7)
x_name <- "ID"
y_name <- "Date"
z_name <- "value"   

df <-data.frame(x,y,z)
names(df) <- c(x_name,y_name,z_name)

#processing

df$date <-format(as.Date(as.character(df$date), format="%Y%m%d"))
df01 <- split(df, f = df$ID)

#goal
a <-c(1)
b <-c(20200101)
c <-c(4.5)
d <-c(2)
e <-c(20200101)
f <-c(5)
g <-c(3)
h <-c(20200101)
i <-c(7)

df_goal <- data.frame(a,b,c,d,e,f,g,h,i)

1
data.frame(t(unlist(df01)))不能满足您的需求吗?在这里,您需要重命名被混淆的列。 - PKumar
2
当ID=1有两行时会发生什么? - zx8754
4个回答

3
你可以使用 Reducecbinddata.frame 的每一行合并为一行,并且保持列的类型。
Reduce(function(x,y) cbind(x, df[y,]), 2:nrow(df), df[1,])
#  ID     Date value ID     Date value ID     Date value
#1  1 20200101   4.5  2 20200101     5  3 20200101     7
#Equivalent for the sample dataset: cbind(cbind(df[1,], df[2,]), df[3,])

使用splitdo.call函数:
do.call(cbind, split(df, 1:nrow(df)))
#  1.ID   1.Date 1.value 2.ID   2.Date 2.value 3.ID   3.Date 3.value
#1    1 20200101     4.5    2 20200101       5    3 20200101       7
#Equivalent for the sample dataset: cbind(df[1,], df[2,], df[3,])

如果您的ID有多行记录,可以尝试以下方法:

x <- split(df, df$ID)
y <- max(unlist(lapply(x, nrow)))
do.call(cbind, lapply(x, function(i) i[1:y,]))

@GKi,谢谢,这个方法非常有效。正如zx8754在上面提到的那样,我想知道如果每个ID有多行数据,你的解决方案(do.call(cbind, split(df, 1:nrow(df))))会是什么样子。因为现在你的解决方案只能按行转置,因为每个ID只有一行数据。 - Olli

1
这是您的示例可能的解决方案:

new_df = data.frame(list(df[1,],df[2,],df[3,]))

如果您想将其推广到更大的数据框:

new_list = list()
for ( i in 1:dim(df)[1] ){
    new_list[[i]] = df[i,]
}
new_df = data.frame(new_list)

1
一种选项可能是:

setNames(Reduce(c, asplit(df, 1)), letters[1:Reduce(`*`, dim(df))])

     a          b          c          d          e          f          g          h          i 
   1.0 20200101.0        4.5        2.0 20200101.0        5.0        3.0 20200101.0        7.0 

不错的解决方案!我喜欢它。 - ThomasIsCoding

0

也许你可以尝试下面的代码

df_goal <- data.frame(t(c(t(df))))

这样

> df_goal
  X1       X2  X3 X4       X5 X6 X7       X8 X9
1  1 20200101 4.5  2 20200101  5  3 20200101  7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接