我是R的初学者,我有以下数据,其中表格如下:
dt
fct X Y Z fct1 Q
1: a 2 1 a:a a a:a:2
2: b 4 2 b:b b b:b:4
3: c 3 1 c:c c c:c:3
4: d 2 2 d:d d d:d:2
5: c 5 1 c:c c c:c:5
6: d 4 2 d:d d d:d:4
7: a 7 1 a:a a a:a:7
8: b 2 2 b:b b b:b:2
9: c 9 1 c:c c c:c:9
10: a 1 2 a:a a a:a:1
11: b 4 1 b:b b b:b:4
12: c 2 2 c:c c c:c:2
13: b 5 1 b:b b b:b:5
14: c 4 2 c:c c c:c:4
15: d 2 1 d:d d d:d:2`
并且有一个像这样的列表:
flist
$a
[1] "X + Y"
$b
[1] "X - Y"
$c
[1] "X * Y"
$d
[1] "paste0(Z,':',fct)"
由于flist
有一个a
条目,只要看到a
列中的条目fct
,就需要执行列表中的相应公式, Y
和Z
列的值,并应用于列XY
。
我试过这样的解决方案:
within(dt2, XY <- eval(parse(text=flist['a'])))
,与明确看到的约束一起使用,也就是说,它只能应用a
的公式。
然而,这:within(dt2, XY <- eval(parse(text=flist[fct])))
不起作用。
即便如此:within(dt2, XY <- eval(parse(text=eval(parse(text=flist[fct]))))))
也不起作用。
用例就是,在查看fct
列时,应使用其变量在flist
中查找公式,然后应用X
中的数据和{{1并应用于Y
。
我很期待寻求帮助。
答案 0 :(得分:2)
我们可以通过在'i'中指定逻辑条件来使用data.table
方法(假设'fct'是character
类,并从{:=
分配list
来自{ {1}}元素(flist$a
)创建新列'XY'
dt[fct == names(flist), XY := eval(parse(text=flist$a))]
dt
# fct X Y Z fct1 Q XY
# 1: a 2 1 a:a a a:a:2 3
# 2: b 4 2 b:b b b:b:4 NA
# 3: c 3 1 c:c c c:c:3 NA
# 4: d 2 2 d:d d d:d:2 NA
# 5: c 5 1 c:c c c:c:5 NA
# 6: d 4 2 d:d d d:d:4 NA
# 7: a 7 1 a:a a a:a:7 8
# 8: b 2 2 b:b b b:b:2 NA
# 9: c 9 1 c:c c c:c:9 NA
#10: a 1 2 a:a a a:a:1 3
#11: b 4 1 b:b b b:b:4 NA
#12: c 2 2 c:c c c:c:2 NA
#13: b 5 1 b:b b b:b:5 NA
#14: c 4 2 c:c c c:c:4 NA
#15: d 2 1 d:d d d:d:2 NA
如果'flist'中有多个元素
for(j in seq_along(flist)){
dt[fct == names(flist)[j], XY := eval(parse(text= flist[[j]]))][]
}
dt
# fct X Y Z fct1 Q XY
# 1: a 2 1 a:a a a:a:2 3
# 2: b 4 2 b:b b b:b:4 2
# 3: c 3 1 c:c c c:c:3 3
# 4: d 2 2 d:d d d:d:2 NA
# 5: c 5 1 c:c c c:c:5 5
# 6: d 4 2 d:d d d:d:4 NA
# 7: a 7 1 a:a a a:a:7 8
# 8: b 2 2 b:b b b:b:2 0
# 9: c 9 1 c:c c c:c:9 9
#10: a 1 2 a:a a a:a:1 3
#11: b 4 1 b:b b b:b:4 3
#12: c 2 2 c:c c c:c:2 4
#13: b 5 1 b:b b b:b:5 4
#14: c 4 2 c:c c c:c:4 8
#15: d 2 1 d:d d d:d:2 NA
flist <- list(a= "X + Y")
#updated flist
flist <- list(a = "X + Y", b = "X - Y", c = "X * Y")