在R中使用带有嵌套if语句的循环,以从数据帧中的非NA值填充列

时间:2017-02-03 07:56:45

标签: r dataframe na coalesce

我有3列数据,我想用它来填充D列(最后结果的示例如下,当前列D为空白)。对于每一行,列A-C将具有1个填充值和2个NA值。我怎么能这样做?

    A   B   C   D
1  'a' NA  NA  'a'
2  NA  'b' NA  'b'
3  NA  'b' NA  'b'
4  NA  NA 'c'  'c'
5  NA  NA 'c'  'c'
6  'a' NA  NA  'a'
7  'a' NA  NA  'a'
8  NA  NA 'c'  'c'

我尝试了以下功能,虽然它没有出错,但它并没有填充我的数据集。我想知道我做错了什么。

感谢您的帮助

pop_D <- function(dataset){
for(i in 1:nrow(dataset)){
    if(!is.na(dataset[i,'A'])){
    dataset[i,'D'] <- dataset[i,'A']
  }else if(!is.na(dataset[i,'B'])){
    dataset[i,'D'] <- dataset[i,'B']
  }else{
    dataset[i,'D'] <- dataset[i,'C']
  }
 }
}
pop_D(ds)

3 个答案:

答案 0 :(得分:1)

我们可以使用pmax来执行此操作

df1$D <- do.call(pmax, c(df1[1:3], na.rm = TRUE))
df1$D
#[1] "a" "b" "b" "c" "c" "a" "a" "c"

或者第二个选项是对非NA元素的逻辑max.col应用matrix以获取具有行索引的列索引cbind,并根据这些索引提取元素

df1[1:3][cbind(1:nrow(df1), max.col(!is.na(df1[1:3]), 'first'))]
#[1] "a" "b" "b" "c" "c" "a" "a" "c"

答案 1 :(得分:0)

作为akrun答案的补充,如果您有一个矩阵(或您使用as.matrix()转换的数据框),您只需合并所有数据并省略所有NA& #39; s创建变量D,即

mt<-matrix(c("a",NA,NA,"a",NA,"b",NA,NA,NA,NA,"c",NA),ncol=3) #create test data

cbind(mt,na.omit(c(as.matrix(mt))))

答案 2 :(得分:0)

考虑dft作为输入,您可以使用dplyr并执行:

dft %>%
  mutate(D = coalesce(A,B,C))

给出:

     A    B    C D
1    a <NA> <NA> a
2 <NA>    b <NA> b
3 <NA>    b <NA> b
4 <NA> <NA>    c c
5 <NA> <NA>    c c
6    a <NA> <NA> a
7    a <NA> <NA> a
8 <NA> <NA>    c c

P.S。我通过将问题复制为:

来准备样本输入数据
dft <- read.table(header = TRUE, text = "id    A   B   C   D
1  'a' NA  NA  'a'
2  NA  'b' NA  'b'
3  NA  'b' NA  'b'
4  NA  NA 'c'  'c'
5  NA  NA 'c'  'c'
6  'a' NA  NA  'a'
7  'a' NA  NA  'a'
8  NA  NA 'c'  'c'",stringsAsFactors=FALSE)

dft$id<- NULL
dft$D <- NULL