0
我有很多列要使用同一data.table中的其他列的值進行更新。我需要使用他們的字符串名稱。事實上,我有如下形式的變量名的非常大的向量:使用其他相同data.table的列更新列,只使用其字符串名稱
cols.x <- c('name1.x', 'name2.x', 'name3.x', ...)
,我想使用其他列更新:
cols.y <- c('name1.y', 'name2.y', 'name3.y', ...)
但是,我無法找到一種方法,使data.table瞭解我也在右側的列= =,而不是字符串。
這裏是工作示例:
library(data.table)
# Setting the data.table
DT <- data.table(V1.x=c(NA,c(1:5)), V2.x=c(NA,LETTERS[1:5]), V1.y=6:1, V2.y=LETTERS[1:6])
# Preparing the columns
cols.x <- c('V1.x','V2.x')
cols.y <- c('V1.y','V2.y')
# Assign cols.y to cols.x when cols.x is NA
DT[is.na(V1.x) | is.na(V2.x), cols.x := cols.y, with = F]
print(DT)
# Output
V1.x V2.x V1.y V2.y
1: NA V1.y 6 A
2: 1 A 5 B
3: 2 B 4 C
4: 3 C 3 D
5: 4 D 2 E
6: 5 E 1 F
# Desired Output
V1.x V2.x V1.y V2.y
1: 6 A 6 A
2: 1 A 5 B
3: 2 B 4 C
4: 3 C 3 D
5: 4 D 2 E
6: 5 E 1 F
我試過很多其他的解決方案,如:
DT[is.na(V1.x) | is.na(V2.x), cols.x := get(cols.y)]
# or
DT[is.na(V1.x) | is.na(V2.x), cols.x := as.list(cols.y)]
,但沒有給我所需的輸出。
作爲data.table 1.10.4的,你可以使用前置'..'到data.table的'之外創建的變量名的參考向量',所以下面的回答你的答案DT [is.na(V1.x)| is.na(V2.x),(cols.x):= DT [is.na(V1.x)| is.na(V2.x),..cols.y]]'。 – lmo
謝謝!所以這是「with = FALSE」的新版本? –
在某些情況下,它確實替換了'with = FALSE'的某些功能,但它的功能類似於'.N'或'.grp'這樣的保留字。它基本上說,查找具有給定名稱的對象的一個級別,並將它們用作變量。正如你在前面的警告'DT [i,(colvector):= val]'中看到的那樣'是'with = FALSE'的另一個實例。在這裏查看使用'..'前綴的帖子:https://github.com/Rdatatable/data.table/blob/master/NEWS.md版本1.10.2 – lmo