簡體   English   中英

將ifelse()應用於動態列在另一列上的多個列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM