2017-07-20 13 views
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)] 

,但沒有給我所需的輸出。

回答

0

我剛剛發現這個解決方案,它的工作原理

DT[is.na(V1.x) | is.na(V2.x), (cols.x) := DT[is.na(V1.x) | is.na(V2.x),cols.y, with = F]] 
+1

作爲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

+0

謝謝!所以這是「with = FALSE」的新版本? –

+2

在某些情況下,它確實替換了'with = FALSE'的某些功能,但它的功能類似於'.N'或'.grp'這樣的保留字。它基本上說,查找具有給定名稱的對象的一個​​級別,並將它們用作變量。正如你在前面的警告'DT [i,(colvector):= val]'中看到的那樣'是'with = FALSE'的另一個實例。在這裏查看使用'..'前綴的帖子:https://github.com/Rdatatable/data.table/blob/master/NEWS.md版本1.10.2 – lmo

相關問題