根据某些条件制作新的数据框

时间:2018-11-21 16:52:04

标签: r dataframe

我在 R 中有一个数据框对象,其示例如下:

4   5   3
4   5   9
4   5   2
4   6   4
4   10  4
4   10  3
4   10  7
4   10  2
4   9   3
4   9   7
4   10  4
4   10  3
4   6   8
4   5   4
12  3   6
12  4   1
12  4   2
12  4   7

我要从此数据框创建一个新的 20 列的数据框,如下所示:

  1. 对于$1中的每个唯一值,新数据框中仅一行。因此,对于此样本数据,新数据框应具有2行(唯一的4,12)。

  2. $2表示新数据帧的列号,其中$3(此数据帧的值)的值将被填充。如果有重复的情况,则取$3的中间值。例如,对于 $1的值4、5重复4次,在新的数据帧中,第一行的第5列的值应为average(3,9,2,4)= 3。

  3. 所有其他列值为零。

此数据的示例输出如下:

0 0 0 0 3 4 0 0 3 4 0 0 0 0 0 0 0 0 0 0
0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我们如何在R中做到这一点?预先感谢!

2 个答案:

答案 0 :(得分:0)

您确定预期结果正确吗?我认为在计算您的问题的中位数时有一个错误,正如评论中所指出的那样。您可以按照以下步骤进行操作:

library(dplyr)

df$V1 <- as.numeric(as.factor(df$V1))
values <- df %>% group_by(V1,V2) %>% summarise(median=median(V3))
new_df <- matrix(0,nrow=length(unique(df$V1)), ncol=20)

for(i in 1:nrow(new_df)){
  for(j in 1:ncol(new_df)){
    value <- values$median[values$V1==i & values$V2==j]
    if(length(value)>0){
      new_df[i,j] = value  
    }
  }
}

new_df

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    0    0    0    0  3.5    6    0    0    5   3.5     0     0     0     0     0     0     0     0     0     0
[2,]    0    0    6    2  0.0    0    0    0    0   0.0     0     0     0     0     0     0     0     0     0     0

尽管结果略有不同。

答案 1 :(得分:0)

df = transform(df,V1=factor(V1))
fill = matrix(0,length(levels(df$V1)),20)
df2=aggregate(V3~.,df,function(x)floor(median(x)))
fill[cbind(as.integer(df2$V1),df2$V2)]=df2$V3
fill
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,]    0    0    0    0    3    6    0    0    5     3     0     0     0     0
[2,]    0    0    6    2    0    0    0    0    0     0     0     0     0     0
     [,15] [,16] [,17] [,18] [,19] [,20]
[1,]     0     0     0     0     0     0
[2,]     0     0     0     0     0     0