[英]Apply ifelse() to multiple columns with dynamic contingency on another column
我有一個包含NAs
的數據集。 我想用取決於另一第二列的值來填充這些值。 但是,此輔助列是動態的,並且根據主列而變化。
為了說明,我想復制以下過程:
l1 <- c("A", "A", "A", "A")
l2 <- c(NA, "B", "B", "B")
l3 <- c(NA, NA, "C", "C")
l4 <- c(NA, NA, NA, "D")
prodmap <- data.frame(l1, l2, l3, l4)
prodmap[] <- lapply(prodmap, as.character)
prodmap$l2 <- ifelse(is.na(prodmap$l2), prodmap$l1, prodmap$l2)
prodmap$l3 <- ifelse(is.na(prodmap$l3), prodmap$l2, prodmap$l3)
prodmap$l4 <- ifelse(is.na(prodmap$l4), prodmap$l3, prodmap$l4)
我怎樣才能做到這一點? 尤其是,應該像上面一樣,不需人工指定就以其名稱動態調用列。 我相信可以使用循環,但是到目前為止,我還無法弄清楚如何應對動態更改列名的挑戰。
使用upper.tri
的選項
prodmap[upper.tri(prodmap)] <- t(prodmap)[upper.tri(prodmap)]
prodmap
# l1 l2 l3 l4
#1 A A A A
#2 A B B B
#3 A B C C
#4 A B C D
這個想法是用我們第一次轉置prodmap
時得到的值填充prodmap[upper.tri(prodmap)]
中所有的缺失值,然后從上三角中找到的結果矩陣中提取值。
由於下一列取決於上一列,因此我們可以使用帶索引的for
循環來執行此操作
for(i in 2:ncol(prodmap)) prodmap[[i]] <- ifelse(is.na(prodmap[[i]]),
prodmap[[i-1]], prodmap[[i]])
prodmap
# l1 l2 l3 l4
#1 A A A A
#2 A B B B
#3 A B C C
#4 A B C D
如果要使用列名而不是列索引,則創建兩個列名vector
,刪除第一個和最后一個列名('nm1','nm2'),遍歷vector
的序列,提取相應的列名基於索引並更新“ prodmap”列
nm1 <- tail(names(prodmap), -1)
nm2 <- head(names(prodmap), -1)
for(i in seq_along(nm1)) {
prodmap[[nm1[i]]] <- ifelse(is.na(prodmap[[nm1[i]]]),
prodmap[[nm2[i]]],
prodmap[[nm1[i]]])
}
注意:假設NA可以分布在列中的任何位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.