我在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
执行此操作的最佳方法是什么?
答案 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