【问题标题】:Select one non NA from multiple rows从多行中选择一个非 NA
【发布时间】:2017-04-08 00:32:51
【问题描述】:

很惊讶以前没有人问过这个问题(据我所知)

我有一个包含多列和两行的 data.frame,如下所示。

df<-as.data.frame(rbind(row1=c(NA,NA,rep(0,2),"FOO",NA,"BAR","FOO","FOOBAR","ETC"),
                   row2=c(300,23.4,1,2,"BAR","FOO","BAR","HELLO","WORLD","ETC")))

我想选择第一行中的条目作为默认值,但前提是它不是NA。如果是NA 我想进入第二行。我尝试了以下方法:

apply(df,2,function(x) ifelse(is.na(x[1]),x[2],x[1]))

但是,x 是数字和字符的组合,并且每个列类都需要维护,因此 apply 会导致问题。我还需要它作为数据框而不是命名向量返回。

【问题讨论】:

  • 你的应用函数应该是:(df,2,function(x) ifelse(is.na(x[1]),x[2],x[1]))
  • 好地方,已解决问题。
  • 嗯,共享的数据框将所有列作为因子。

标签: r dataframe rows na


【解决方案1】:

试试这个,看看这是不是你想要的。

df<-as.data.frame(rbind(row1=c(NA,NA,rep(0,2),"FOO",NA,"BAR","FOO","FOOBAR","ETC"),
                        row2=c(300,23.4,1,2,"BAR","FOO","BAR","HELLO","WORLD","ETC")))


outDF <- lapply(df, function(x){
  if(is.na(x[[1]])&!is.na(x[[2]])){
    x[[1]] <- x[[2]]
  }
  x
})
data.frame(outDF, stringsAsFactors = FALSE) 

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2022-01-05
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多