将列表中的值与数据框中的列名进行匹配以更新值

时间:2018-08-22 02:04:12

标签: r

我经过漫长而艰苦的搜索,未能找到答案,感谢我能提供的任何帮助。

我有两个列表和一个数据框。第一个列表包含字符串,这些字符串是数据框的列名称:

> 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]]

}

我一直在努力寻找另一种解决方案(也许是某种形式的申请?)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我们可以使用行/列索引。通过根据lengths对象之一的list复制行的顺序来创建行索引(假设两个list具有相同的结构)

rn <- rep(seq_len(nrow(pct_rev_df)), lengths(pct_array))

类似地,通过match ed的“ name_array”和“ pct_rev_df”的unlistnames来创建列索引

cn  <- match(unlist(name_array), names(pct_rev_df))

根据索引提取'pct_rev'的值,并将其转换为vectorunlist)后将其分配给'pct_array'的值

pct_rev_df[cbind(rn, cn)] <- unlist(pct_array)