.SD看起来很有用,但我真的不知道我在做什么.它代表什么?为什么会有前一段时间(句号).我用它时发生了什么?
我读到:
.SD是一个data.table包含x每个组的数据子集,不包括组列.它可以在分组i时,分组by,键控by和_ad hoc_时使用by
这是否意味着女儿data.table被留在内存中进行下一次操作?
我在这个主题上看过类似的帖子,但无法理解解决方案.基本上我有一个数据表(DT1)与分数和一些NA.只要有'NA',我想要一个引用另一个数据(DT2)表的过程,该表在两个表(通道)中都有一个公共列,然后使用DT2的得分列值更新DT1中的NA.我正在选择一个数据表类,因为我认为它是一个有效的选择.
DT1
tract CreditScore
1: 36107020401 635
2: 36083052403 NA
3: 36091062602 NA
4: 36067013000 NA
5: 36083052304 NA
Run Code Online (Sandbox Code Playgroud)
DT2
tract CreditScore
1: 36107020401 635
2: 36083052403 650
3: 36091062602 335
4: 36067013000 777
5: 36083052304 663
Run Code Online (Sandbox Code Playgroud) 是否可以在 data.table 中通过引用结合链接和赋值?
例如,我想这样做:
DT[a == 1][b == 0, c := 2]
Run Code Online (Sandbox Code Playgroud)
但是,这会使原始表保持不变,因为似乎在 DT[a == 1] 之后创建了一个临时表,随后更改并返回了该表。
我宁愿不做
DT[a == 1 & b == 0, c := 2]
Run Code Online (Sandbox Code Playgroud)
因为这很慢,我也宁愿避免
DT <- DT[a == 1][b == 0, c := 2]
Run Code Online (Sandbox Code Playgroud)
因为我更愿意通过参考进行分配。这个问题是问题 [1] 的一部分,这里没有答案。
我希望能够有条件地更新列,其中一个条件基于多个键上的表连接.有没有其他方法比使用ifelse这样做?
例如,我想根据连接更新标志,但首先排除状态不是NA的地方:
library(data.table)
dt_A <- data.table(key1 = LETTERS[1:6], key2 = (1:6), flag=NA_character_ )
dt_A[4, flag:="exclude"]
dt_B <- data.table(key1 = LETTERS[3:6], key2 = c(3:5,0L))
print(dt_A)
key1 key2 flag
1: A 1 NA
2: B 2 NA
3: C 3 NA
4: D 4 exclude
5: E 5 NA
6: F 6 NA
print(dt_B)
key1 key2
1: C 3
2: D 4
3: E 5
4: F 0
Run Code Online (Sandbox Code Playgroud)
使用ifelse达到了正确的结果:
dt_A[dt_B, flag:=ifelse(is.na(flag), "include", flag), on = c("key1","key2"), nomatch=0L]
print(dt_A) …Run Code Online (Sandbox Code Playgroud) 我想更新旧的列data.table基于一个新的data.table,只有当值不NA.
DT_old = data.table(x=rep(c("a","b","c")), y=c(1,3,6), v=1:3, l=c(1,1,1))
DT_old
x y v l
1: a 1 1 1
2: b 3 2 1
3: c 6 3 1
DT_new = data.table(x=rep(c("b","c",'d')), y=c(9,6,10), v=c(2,NA,10), z=c(9,9,9))
DT_new
x y v z
1: b 9 2 9
2: c 6 NA 9
3: d 10 10 9
Run Code Online (Sandbox Code Playgroud)
我想要输出
x y v z
1: b 9 2 9
2: c 6 3 9
3: d 10 10 9
4: a 1 …Run Code Online (Sandbox Code Playgroud) df1 <- data.frame(w = 1:4, x = c("a", "b", "b", "c"), y = NA)
df1$y[df1$x == "c"] = 1
df2 <- data.frame(x = c("a", "b"), y = 1:2, z = 3:4)
Run Code Online (Sandbox Code Playgroud)
我想用df2中的值更新df1以匹配行,包括所有df2列.
预期结果:
df1
w x y z
1 1 a 1 3
2 2 b 2 4
3 3 b 2 4
4 4 c 1 NA
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
# add missing columns from df2 to df1
df1[setdiff(colnames(df2), colnames(df1))] <- NA
# update values in df1 from df2 for matching …Run Code Online (Sandbox Code Playgroud)