R &引用;“1级无此类索引”;尝试以编程方式使用data.table时,特定场景出现错误 问题

R &引用;“1级无此类索引”;尝试以编程方式使用data.table时,特定场景出现错误 问题,r,data.table,subset,R,Data.table,Subset,我编写了一个函数以编程方式使用data.table。功能如下 transformVariables4 <- function(df_1n_data, c_1n_variablesToTransform, c_1n_newVariableNames,

我编写了一个函数以编程方式使用data.table。功能如下

transformVariables4              <- function(df_1n_data,
                                             c_1n_variablesToTransform,
                                             c_1n_newVariableNames,
                                             f_01_functionToTransform,
                                             ...) {

  for (i in 1:length(c_1n_variablesToTransform)) {
    df_1n_data[, c(c_1n_newVariableNames[i]) := list(forceAndCall(n = 1, FUN = f_01_functionToTransform, df_1n_data[[c_1n_variablesToTransform[i]]], ...))]
  }

  return(df_1n_data)
}
顶部的代码行(由
12
指示)位于函数
[.data.frame
的源代码中。对于第一种情况,该代码行中的
i
值为

"e"
但对于第二种情况,情况确实如此

c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_)
这使得
.subset2(x,i,exact=exact)
失败。下一步是找出这种行为的原因

更新

找出了此行为的原因。这是因为中的
:=
右侧的
i

df_1n_data[, c(c_1n_newVariableNames[i]) := list(forceAndCall(n = 1, FUN = f_01_functionToTransform, df_1n_data[[c_1n_variablesToTransform[i]]], ...))]
  }
匹配数据中的列名。下一步是找出发生这种情况的确切原因以及正确的方法

更新

感谢罗兰帮助我理解为什么会发生这种情况,以及正确的做法是什么


i
问题是一个范围问题。data.table在其搜索路径上使用第一个
i
,这是数据中的
i
列,该列都是
NA
s,这反过来会导致
.subset2
失败。正确的方法是使用罗兰solut的第二个函数ion

我会这样重写它:

transformVariables4              <- function(df_1n_data,
                                             c_1n_variablesToTransform,
                                             c_1n_newVariableNames,
                                             f_01_functionToTransform,
                                             ...) {

  for (i in seq_along(c_1n_variablesToTransform)) {
    var <- c_1n_variablesToTransform[i] #to force evaluation
    df_1n_data[, (c_1n_newVariableNames[i]) := f_01_functionToTransform(get(var), ...)]
  }

  df_1n_data[]
}
library(data.table)

df <- data.frame(abcd = (as.Date("1991-12-22") + 1:10), e = 1, f = 2, g = 3, h = 4, i = 5, j = 6, k = 7, l = 8)
df4 <- transformVariables4(
  df_1n_data = data.table(df),
  c_1n_variablesToTransform = "e",
  c_1n_newVariableNames = "new",
  f_01_functionToTransform = sum,
  na.rm = TRUE
)

transformVariables4@Roland Hi:)你可以运行函数定义的代码,也可以运行它不起作用的场景的代码。你应该会得到错误。非常感谢!这两个函数都非常有效:)我有两个问题1.为什么
df_1n_data[]中的方括号
?2.对于问题中的函数定义,问题似乎是因为代码中的
i
与数据中的列名匹配。当我从数据中删除
i
列时,它起作用了!你能给我指一些阅读材料,让我更好地理解为什么会发生这种情况吗?1)如果你不包括这一点,第一次在控制台中键入
df4
时不会打印结果。这已在data.table版本的新闻中介绍过,并且可能在文档中的某个地方找到。2)这是一个典型的范围问题。data.table如何知道您指的是哪个
i
?它使用在搜索pa上首先找到的th.1)我注意到结果有时不会打印在控制台上。我认为这是我面临的一些随机问题:P现在我知道它不是2)OK。我可以将
I
更改为一些外来字符串,这样它成为列名的可能性就很小。但是,解决方案中的第二个函数甚至没有循环,是对开发人员更友好:)我会使用它,谢谢:)我支持“更惯用”的一个,以及缩短变量名称的建议。也许更惯用的是在它前面的行中添加尾随[]。无论如何,这就是我所做的。
c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_)
df_1n_data[, c(c_1n_newVariableNames[i]) := list(forceAndCall(n = 1, FUN = f_01_functionToTransform, df_1n_data[[c_1n_variablesToTransform[i]]], ...))]
  }
transformVariables4              <- function(df_1n_data,
                                             c_1n_variablesToTransform,
                                             c_1n_newVariableNames,
                                             f_01_functionToTransform,
                                             ...) {

  for (i in seq_along(c_1n_variablesToTransform)) {
    var <- c_1n_variablesToTransform[i] #to force evaluation
    df_1n_data[, (c_1n_newVariableNames[i]) := f_01_functionToTransform(get(var), ...)]
  }

  df_1n_data[]
}
library(data.table)

df <- data.frame(abcd = (as.Date("1991-12-22") + 1:10), e = 1, f = 2, g = 3, h = 4, i = 5, j = 6, k = 7, l = 8)
df4 <- transformVariables4(
  df_1n_data = data.table(df),
  c_1n_variablesToTransform = "e",
  c_1n_newVariableNames = "new",
  f_01_functionToTransform = sum,
  na.rm = TRUE
)
transformVariables4              <- function(df_1n_data,
                                             c_1n_variablesToTransform,
                                             c_1n_newVariableNames,
                                             f_01_functionToTransform,
                                             ...) {

  df_1n_data[, (c_1n_newVariableNames) := lapply(.SD, f_01_functionToTransform, ...), 
              .SDcols = c_1n_variablesToTransform]

  df_1n_data[]
}