我在 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
中的每个唯一值,新数据框中仅一行。因此,对于此样本数据,新数据框应具有2行(唯一的4,12)。
$2
表示新数据帧的列号,其中$3
(此数据帧的值)的值将被填充。如果有重复的情况,则取$3
的中间值。例如,对于
$1
的值4、5重复4次,在新的数据帧中,第一行的第5列的值应为average(3,9,2,4)= 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中做到这一点?预先感谢!
答案 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