我用dplyr
我的數據來創建數據的這樣一個子集:查找字符串填寫新列
dd <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L),
`1` = c("eg", NA, NA, "eg", "eg", NA, NA, NA, NA, "eg", NA),
`2` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, "eg", NA),
`3` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, NA, NA),
`4` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA),
`5` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA),
`6` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA))
我現在要檢查除ID的每一列,如果它含有的特定字符串。在這個例子中,我想爲每個包含「eg」和「0」的列的ID創建1個「1」列。同樣,還有一列告訴我在其他列中是否有「sk」或「lk」。之後,除ID之外的舊列可以從數據中刪除。框架
對我來說困難的部分是用動態數量的列來完成此操作,因爲我的dplyr
-subset將根據特定情況返回不同數量的列,但我需要檢查每種情況下創建的每一個。我想首先使用unite將所有字符串放在一起,但是我會遇到同樣的問題:如何合併除第一個ID之外的所有列。
如果這可以解決在dplyr
這將是完美的,但任何工作解決方案是讚賞。
結果應該是這樣的:
result <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L),
with_eg = c(1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0),
with_sk_or_lk = c(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0))
也許更簡單: 'x = dd [-1] =='eg'; cbind(dd [1],1 * !! rowSums(x,na.rm = T),1 * !! rowSums(!x,na.rm = T))' –
不錯。使用'1 * !!'將整數轉換爲二進制(0,1)非常酷。 – lmo
或'+ !!'但它不是很明確。 –