R data.table处理混淆变量名的单行语句
假设R data.table处理混淆变量名的单行语句,r,data.table,R,Data.table,假设dt是一个data.table对象,包含a、B和C 我希望在列上循环以筛选出一些行,然后在该列上应用函数: for(col in c("A", "B", "C")){ dt[col %in% some_filter[[col], col := some_function(col), with=FALSE] } 其中some_filter是包含一些有效值的列表,例如some_filter[[“a”]=c(“just”、“an”、“example”)等 然而,通过在这4个位置中引用col,
dt
是一个data.table
对象,包含a
、B
和C
我希望在列上循环以筛选出一些行,然后在该列上应用函数:
for(col in c("A", "B", "C")){
dt[col %in% some_filter[[col], col := some_function(col), with=FALSE]
}
其中some_filter
是包含一些有效值的列表,例如some_filter[[“a”]=c(“just”、“an”、“example”)
等
然而,通过在这4个位置中引用col
,data.table
似乎把名称空间搞得一团糟,并且失败得很惨
通过临时变量可以解决这个问题,但是如何在一行中完成这个任务呢
不工作的代码是:
library(data.table)
library(dplyr)
dt <- data.table(A=1:10, B=11:20, C=21:30)
f <- list()
f[["A"]] <- 3:5
f[["B"]] <- 14:18
f[["C"]] <- 28:29
for(col in colnames(dt)){
dt[col %in% f[[col]], col := col * 2, with=F] # Double up some rows
}
库(data.table)
图书馆(dplyr)
dt我们可以使用get
从包含列名称的字符变量访问列()
关于的左侧:=
也比使用with=F
for(col in colnames(dt)){
dt[get(col) %in% f[[col]], (col) := get(col) * 2L] # Double up some rows
}
# A B C
# 1: 1 11 21
# 2: 2 12 22
# 3: 6 13 23
# 4: 8 28 24
# 5: 10 30 25
# 6: 6 32 26
# 7: 7 34 27
# 8: 8 36 56
# 9: 9 19 58
# 10: 10 20 30
我们可以使用get
从包含列名称的字符变量访问列()
关于的左侧:=
也比使用with=F
for(col in colnames(dt)){
dt[get(col) %in% f[[col]], (col) := get(col) * 2L] # Double up some rows
}
# A B C
# 1: 1 11 21
# 2: 2 12 22
# 3: 6 13 23
# 4: 8 28 24
# 5: 10 30 25
# 6: 6 32 26
# 7: 7 34 27
# 8: 8 36 56
# 9: 9 19 58
# 10: 10 20 30
另一个选项是使用set
for(nm1 in names(dt)) {
i1 <- which(dt[[nm1]] %in% f[[nm1]])
set(dt, i= i1, j = nm1, value = dt[[nm1]][i1]*2L)
}
dt
# A B C
# 1: 1 11 21
# 2: 2 12 22
# 3: 6 13 23
# 4: 8 28 24
# 5: 10 30 25
# 6: 6 32 26
# 7: 7 34 27
# 8: 8 36 56
# 9: 9 19 58
#10: 10 20 30
for(名称中的nm1(dt)){
i1另一个选项是使用set
for(nm1 in names(dt)) {
i1 <- which(dt[[nm1]] %in% f[[nm1]])
set(dt, i= i1, j = nm1, value = dt[[nm1]][i1]*2L)
}
dt
# A B C
# 1: 1 11 21
# 2: 2 12 22
# 3: 6 13 23
# 4: 8 28 24
# 5: 10 30 25
# 6: 6 32 26
# 7: 7 34 27
# 8: 8 36 56
# 9: 9 19 58
#10: 10 20 30
for(名称中的nm1(dt)){
i1您是否可以将预期输出添加到问题中。可能您需要的是数据表callYes中的get(col)
,请使用live(即示例函数)填充f
,并添加预期输出。您是否可以将预期输出添加到问题中。可能您需要的是get(col)
在data.table callYes中,请用live(即示例函数)填写f
,并添加预期输出。