我一直在翻譯this question到data.table
解決方案。 (保持簡單我將使用相同的數據集)
當V2 == "b
我想交換V1 <-> V3
之間的列。使用data.table交換兩列之間的值
dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
#V1 V2 V3
#1: 1 a 2
#2: 2 a 3
#3: 4 b 1
下面的代碼將是data.frame
工作解決方案,但是無奈這個量,因爲已經因爲我使用的是data.table
沒有意識到現在我決心要找到data.table的解決方案給我。
dt <- data.table(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1))
df <- as.data.frame(dt)
df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")]
# V1 V2 V3
#1 1 a 2
#2 2 a 3
#3 1 b 4
我試圖寫一個lapply
功能,通過我的目標交換列表循環,試圖縮小問題只能更換一個值,試圖調用方式不同的列名,但都沒有成功。
這是我已經成功地得到最接近的嘗試:
> dt[dt$V2 == "b", c("V1", "V3")] <- dt[dt$V2 == "b", c(V3, V1)]
#Warning messages:
#1: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, :
# Supplied 2 items to be assigned to 1 items of column 'V1' (1 unused)
#2: In `[<-.data.table`(`*tmp*`, dt$V2 == "b", c("V1", "V3"), value = c(1, :
# Supplied 2 items to be assigned to 1 items of column 'V3' (1 unused)
我們怎樣才能獲得data.table解決方案?
我猜使用'.SD'比通過'名單(V1,V3快)'? – BenBarnes
@BenBarnes我沒有測試它是否會更快,看起來像'list(V1,V3)'也可以。 – akrun
@eddi,你反對'.SDcols'?如果您有預定義列的向量,我認爲它是更強大的解決方案。 –