使用R中带有嵌套if语句的for循环从dataframe中的非NA值填充列

使用R中带有嵌套if语句的for循环从dataframe中的非NA值填充列,r,dataframe,na,coalesce,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' 我尝试了以下函数,虽然没有出错,但

我有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)

pop\u D我们可以使用
pmax
来完成此操作

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

作为对akrun答案的补充,如果你有一个矩阵(或一个用
转换为.matrix()
)的数据框,你可以组合所有数据,省略所有
NA
,创建变量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))))

mt考虑到
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
A B C D
a
2b
3 b b
4 c c
5摄氏度
六甲
7 a a
8摄氏度

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

dft您缺少一个
返回(数据集)
。谢谢!我花了大约5个小时试图找出问题所在。太好了。我需要更多地了解函数,如
pmax
max.col
。和fair:)…这非常有效。谢谢使用此代码发现的一个问题是,我未能设置dataframe StringsAsAffactors=FALSE。一旦我做到了,它就跑得很棒。太棒了。虽然编写自己的函数很有趣,但大部分内容已经存在了;)。如果有帮助,请看一看
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