在R数据帧

时间:2017-12-11 16:27:06

标签: r dataframe

我的数据框中有2列,因此对于每一行,以下任一行都为真: 1.只有一个有价值(另一个没有) 2.两者都有缺失值

如果两列都缺失,我需要创建一个缺失值的新列,如果只有一列有值,则需要创建非缺失值。

示例:A和B是我的数据集中的列,C是我需要创建的列:

A   B   C
1   NA  1
NA  6   6
NA  NA  NA
9   NA  9
4   NA  4
NA  3   3

此外,我希望将许多这样的列组合在一起,所以理想情况下我希望在一个函数的帮助下执行此操作,我可以传递新列,column1,column2和数据帧的名称。 / p>

我无法理解我该怎么做。任何人都可以指出我正确的方向。

(我搜索了重复的问题,但我发现的问题与非缺失值有关,所以我不得不发布这个类似的问题)

2 个答案:

答案 0 :(得分:1)

怎么样:

fc <- function(data, column1, column2) {
  data$res <- rowSums(data[,c(column1, column2)], na.rm=T)
  data[,data$res==0] <- NA
  return(data)
}

或者如果您的数据不是数字,您更喜欢@ r2evans解决方案:

fc <- function(data, column1, column2) {
  data$res <- ifelse(is.na(data[,column1]), data[,column2], data[,column1])
  return(data)
}

比你打电话:

df2 <- fc(df, "A", "B")

答案 1 :(得分:0)

另一种方法可能是

myFun <- function(df, col1, col2, new_col){
  df[new_col] <- pmax(df[,col1], df[,col2], na.rm = TRUE)
  return(df)
}

myFun(df, "A", "B", "C")

#   A  B  C
#1  1 NA  1
#2 NA  6  6
#3 NA NA NA
#4  9 NA  9
#5  4 NA  4
#6 NA  3  3


#sample data
> dput(df)
structure(list(A = c(1L, NA, NA, 9L, 4L, NA), B = c(NA, 6L, NA, 
NA, NA, 3L)), .Names = c("A", "B"), class = "data.frame", row.names = c(NA, 
-6L))