gpt4 book ai didi

r - 如何在data.table中动态使用lapply?

转载 作者:行者123 更新时间:2023-12-01 13:34:02 25 4
gpt4 key购买 nike

我有一个看起来像

的数据集
set.seed(18)
library(data.table)
site1 <- data.table(id = 1:10, A = c(sample(c(NA, letters[1:10]),10)),
B = sample(c(NA, LETTERS[1:7]), 10, replace = T),
C = sample(c(NA, 1:4), 10, replace = T))

site2 <- data.table(id = c(1:4, sample(5:15, 6)),
A = c(NA, NA, NA, sample(letters, 1), NA, NA, NA, sample(letters, 1), NA, NA),
B = sample(LETTERS, 10), d = sample(1:5, replace = T))

和一个看起来像

的函数
col.smash <- function(a, b, linkvars){
  require(data.table)
 
  ##### CONVERT TO DATA.TABLES FOR EASIER USE, AND MERGE
  if(dim(a)[1] <= dim(b)[1]){
    c <- data.table(a); setkeyv(c, linkvars)
    d <- data.table(b); setkeyv(d, linkvars)
  } else {
    c <- data.table(b); setkeyv(c, linkvars)
    d <- data.table(a); setkeyv(d, linkvars)
  }
 
  k <- c[d]
 
  rep.list<- names(a)[names(a) %in% names(b) & !(names(a) %in% linkvars)]
  i.combo <- paste0("i.",rep.list)

  f <- k[ , (rep.list) := lapply(.SD, function(x){ifelse(is.na(x),
get("i.", names(x)), x)}),
.SDcols = rep.list]
  return(f)
  }

此函数的目标是查看 site1site2 中有哪些变量,如果其中有“NA”,假设 site1$A,替换为site2$A中对应的值。 site1 位于 site2 之上,这就是 ifelse 语句仅检查一个带有“NA”的变量的原因。

我在 lapply 函数中遇到错误,因为第一个 ifelse 结果 (get("i.",names(x))),条件未正常工作后。这样做时,我收到以下错误:

Error in as.environment(pos) : using 'as.environment(NULL)' is defunct

我不明白。理想情况下,我会得到一个 data.table,其中包含 site1site2 中的所有值以及变量 ABCD 而不是 i.Ai.B 这样的,

    id  A  B  C  d
1: 1 i E NA 4
2: 2 g F NA 4
3: 3 h NA 4 1
4: 4 x B 4 2
5: 5 j G NA NA
6: 6 c NA 3 4
7: 7 a D 2 NA
8: 8 b NA 2 NA
9: 9 d G 1 4
10: 10 f NA 1 NA
11: 12 NA V NA 2
12: 13 n J NA 1
13: 14 NA T NA 1
14: 15 NA X NA 1

所以我觉得我真的有两个问题。第一个是错误,第二个是我没有在我的函数中获取 k 中的所有行。他们似乎没有关系。

感谢任何帮助。

另外,谁能找出incredible col.smash 引用,谁就能得到加分。

最佳答案

This function's goal is to see what variables are in both site1 and site2 and if there is an "NA" in, lets say site1$A, replace it with the corresponding value in site2$A. There is a hierarchy of site1 over site2

输出可以是这样的

g <- function(d1, d2, byvars){
D = funion(d1[, ..byvars], d2[, ..byvars])

d2vars = setdiff(names(d2), byvars)
D[d2, on=byvars, (d2vars) := mget(sprintf("i.%s", d2vars))]

d1vars = setdiff(names(d1), byvars)
D[d1, on=byvars, (d1vars) := mget(sprintf("i.%s", d1vars))]

setcolorder(D, c(byvars, d1vars, setdiff(d2vars, d1vars)))
setorderv(D, byvars)[]
}

g(site1, site2, "id")

给出

    id  A  B  C  d
1: 1 i E NA 4
2: 2 g F NA 4
3: 3 h NA 4 1
4: 4 NA B 4 2
5: 5 j G NA NA
6: 6 c NA 3 4
7: 7 a D 2 NA
8: 8 b NA 2 NA
9: 9 d G 1 4
10: 10 f NA 1 NA
11: 12 NA V NA 2
12: 13 n J NA 1
13: 14 NA T NA 1
14: 15 NA X NA 1

工作原理

byvars 参数允许列名向量。

相当新的 .. 语法允许引用存储在 data.table 之外的列的索引。我查看了常见问题解答和 ?data.table,但找不到任何文档。现在,它是 the first changelog item in 1.10.2 at least .

为了提供“site1 高于 site2 的层次结构”,我们首先从 site2 添加,然后从 site1 添加,因此它得到最后的编辑。

funion 的使用假定每个表中没有重复项。如果有,则需要对该步骤采取更复杂的方法,可能类似于

D = rbind(d1[, ..byvars], d2[,..byvars][!d1, on=byvars])

关于r - 如何在data.table中动态使用lapply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44557641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com