使用来自一列的公式和来自其他列的操作数数据将列添加到现有数据表

时间:2016-12-24 15:23:55

标签: r dataframe data.table

我是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,就需要执行列表中的相应公式, YZ列的值,并应用于列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

我很期待寻求帮助。

1 个答案:

答案 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")