数据帧通过匹配行和列来设置单元格值

时间:2018-08-24 12:54:52

标签: r dataframe

我在R中有一个数据框,我想基于两个列表中行和列的特定匹配来设置值。

这是我必须遵循的过程。我有一个数据框,例如以下

   test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0

我有一个函数,将列名作为输入并返回与该列名关联的值。例如:some_function(“ test.var1.t1”)可能返回值10。

我有一些行名的列表和列名的列表。我需要遍历列表中的每个行名和列名,将它们匹配在一起,评估该匹配列的功能,然后将数据框中的值发布到适当的单元格中。例如,

行名列表=“ var1”“ var2”“ var4”

list col名称=“ test.var1.t1”“ test.var2.t1”“ test.var1.t4”“ test.var3.t1”

var1应该与“ test.var1.t1”和“ test.var1.t4”匹配,因此我们从some_function()获得“ test.var1.t1”和“ test.var1.t4”的函数值。假设这些值分别是10和20。

var2应该与“ test.var2.t1”匹配,因此获取“ test.var2.t1”的函数值。假设此值为15。

var4没有匹配的列,而var3不在行列表中,因此应在数据框中将其保留。

完成此操作后,数据帧应更改为此:

      x.var1.t1   x.var2.t1   x.var1.t4   x.var3.t1   x.var3.t7
var1         10           0          20           0           0
var2          0          15           0           0           0
var3          0           0           0           0           0
var4          0           0           0           0           0

执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

nn <- c("var1" ,"var2", "var4")
## I am using a for loop because the side effect is desired here
for(x in nn) {
  ## find the corresponding column names
  col <- grep(x,names(dx),value=TRUE)
  ## if any apply the function 
  if(length(col)>0) dx[x,col] <- get_val(x)
}

使用伪函数get_val测试它:

get_val <- function(x){
  switch(x,
         var1=c(15,20),
         var2=c(10))
} 

dx

dx <- read.table(text=" test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0",
           stringsAsFactors = FALSE)

您将获得预期的结果:

#      test.var1.t1 test.var2.t1 test.var1.t4 test.var3.t1 test.var3.t7
# var1           15            0           20            0            0
# var2            0           10            0            0            0
# var3            0            0            0            0            0
# var4            0            0            0            0            0