我经过漫长而艰苦的搜索,未能找到答案,感谢我能提供的任何帮助。
我有两个列表和一个数据框。第一个列表包含字符串,这些字符串是数据框的列名称:
> name_array[1:5]
[[1]]
[1] "40"
[[2]]
[1] "35" "50"
[[3]]
[1] "55"
[[4]]
[1] "35" "90"
[[5]]
[1] "30"
第二个列表包含与列表1中的名称对应的值:
> pct_array[1:5]
[[1]]
[1] 100
[[2]]
[1] 16.15629 83.84371
[[3]]
[1] 100
[[4]]
[1] 99.818551 0.181449
[[5]]
[1] 100
数据框在列表1中为每个可能的名称值都有一列,所有元素均设置为0:
> pct_rev_df[1:5,]
15 20 25 30 35 40 45 50 55 60 90
1 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0
我正在尝试编写一个代码,当列名与列表#1中的值匹配时,该数据框将使用列表2中的值填充数据框。
换句话说,输出应如下所示:
> pct_rev_df[1:5,]
15 20 25 30 35 40 45 50 55 60 90
1 0 0 0 0 0.00000 100 0 0.00000 0 0 0.000000
2 0 0 0 0 16.15629 0 0 83.84371 0 0 0.000000
3 0 0 0 0 0.00000 0 0 0.00000 100 0 0.000000
4 0 0 0 0 99.81855 0 0 0.00000 0 0 0.181449
5 0 0 0 100 0.00000 0 0 0.00000 0 0 0.000000
我在for循环中使用它,但是我通过脚本放入的数据量对于for循环来说实在太多了:
for(i in 1:5){
pct_rev_df[i,match(name_array[[i]],names(pct_rev_df))] <- pct_array[[i]]
}
我一直在努力寻找另一种解决方案(也许是某种形式的申请?)
任何帮助将不胜感激!
答案 0 :(得分:1)
我们可以使用行/列索引。通过根据lengths
对象之一的list
复制行的顺序来创建行索引(假设两个list
具有相同的结构)
rn <- rep(seq_len(nrow(pct_rev_df)), lengths(pct_array))
类似地,通过match
ed的“ name_array”和“ pct_rev_df”的unlist
来names
来创建列索引
cn <- match(unlist(name_array), names(pct_rev_df))
根据索引提取'pct_rev'的值,并将其转换为vector
(unlist
)后将其分配给'pct_array'的值
pct_rev_df[cbind(rn, cn)] <- unlist(pct_array)