我有以下data.table
:R:如何創建間接基於其他列的非靜態量條件列,在data.table
Name x y h 120Hz 800Hz 1000Hz 1200Hz
1: Tower1 1354 829 245 0 8 7 0
2: Tower2 2654 234 285 7 0 3 0
3: Tower3 822 3040 256 0 4 0 9
4: Tower4 987 2747 250 0 6 5 3
5: Tower5 1953 1739 301 0 0 8 2
你可以用它創建
DT <- data.table(Name = c("Tower1", "Tower2", "Tower3", "Tower4", "Tower5"),
x = c(1354,2654,822,987,1953),
y = c(829,234,3040,2747,1739),
h = c(245,285,256,250,301),
`120Hz` = c(0,7,0,0,0),
`800Hz` = c(8,0,4,6,0),
`1000Hz` = c(7,3,0,5,8),
`1200Hz` = c(0,0,9,3,2))
實際上,它來自之前較大的data.table
。最後四列是使用dcast
從其他data.table
自動生成的,因此無法事先知道列h後的列的數量或名稱。這個很重要。
的最終目標是創建一個名爲「範圍」另一列,每一行,其值列「H」之後,依賴於列中的值,因爲它遵循:
考慮頻率之間的以下關聯範圍。這些是唯一確定的關聯並且是靜態的,所以這些信息可以作爲預定義的data.table
存儲。
assoc <- data.table(Frq = c("800Hz", "1000Hz", "1200Hz"),
Rng = c(750,850,950))
對於柱「H」後的四列中的每一個,該代碼應檢查列名assoc
存在。如果是這樣,並且如果DT
中該行所在行的該列中的值不爲零,則該代碼將考慮相應的Rng值(來自assoc
)。在檢查所有四列後,代碼應該返回所考慮範圍的最大值並存儲在新列「範圍」中。
我的方法:
創建針對每個頻率列一個附配列:
DT <- DT[, paste0(colnames(DT)[5:ncol(DT)],'_r') := 0]
然後,我可以使用條件的結構,確實上述算法。我們以列800Hz_r爲例。該列檢查800Hz列中的值。如果該值對於所討論的行不爲零,則返回750.最後,Range列僅取前4列中的最大值,以_f結尾。我被卡住的地方,我找不到一個有用的命令來這樣做。我試過的所有東西都會引發一些錯誤。
最後,輔助_f列應該被刪除。如果有人知道如何在不創建專業柱的情況下做到這一點,那就更好了。
這是(前輔助列刪除)預期的結果:
Name x y h 120Hz 800Hz 1000Hz 1200Hz 120Hz_f 800Hz_f 1000Hz_f 1200Hz_f Range
1: Tower1 1354 829 245 0 8 7 0 0 750 850 0 850
2: Tower2 2654 234 285 7 0 3 0 0 0 850 0 850
3: Tower3 822 3040 256 0 4 0 9 0 750 0 950 950
4: Tower4 987 2747 250 0 6 5 3 0 750 850 950 950
5: Tower5 1953 1739 301 0 0 8 2 0 0 850 950 950
注:爲什麼有可能是因爲沒有出現在assoc命令頻率列的原因是因爲原始數據可能有錯別字。在這個例子中,列120Hz總是在120Hz_f列中只產生零,因此它不能被認爲是最大範圍。沒關係。
合併b使用你的例子你能不能給我們預期產出? – DJJ
例如,不清楚「範圍的最大值」是否對應於最大值assoc $ Rng或DT中的列。 – lmo
@lmo以_f結尾的列中值的最大值。這些值來自assoc。我更新了問題,以便您可以看到想要的結果。 – JAR