函数
这是我的数据:
colA colB
1 NA
2 3
3 4
4 NA
我想做的是使用这两列,我想创建一个新列,将每个列的值组合起来。它将从B列中获取所有值,但在出现空值的情况下,它将从a列中获取值。输出将如下所示:
colA colB newColumn
1 NA 1
2 3 3
3 4 4
4 NA 4
到目前为止,我的代码看起来是这样的,但它破坏了RStudio。当我在这里打出我的问题时,它实际上仍然在运行:
for(i in 1:length(data$colB)){
if(is.na(data$colB[i])){
data$newColumn <- data$colA}
else{
data$newColumn <- data$colB
}
}
因此假设您的数据如下:
options(stringsAsFactors = FALSE)
df1 <- read.table(text = "colA colB
1 NA
2 3
3 4
4 NA",header=1)
使用ifelse
:解决问题的一行代码
df1$newColumn <- ifelse(is.na(df1$colB), df1$colA, df1$colB)
而您的错误是因为您需要对替换项进行索引,所以您应该在else语句中使用data$newColumn[i] <- data$colA[i]
而不是data$newColumn <- data$colA
。但最好使用矢量化函数,如ifelse
。
dplyr::coalesce
是这类操作的简写。它适用于多个向量,所以如果您有一个colC
,它可能也有值要输入,您可以将其添加到调用中。您按优先级顺序提供向量,因此它将返回它看到的第一个非NA
值。
data <- data.frame(
colA = 1:4,
colB = c(NA_integer_, 3L, 4L, NA_integer_)
)
data$new_column <- dplyr::coalesce(data$colB, data$colA)
data
#> colA colB new_column
#> 1 1 NA 1
#> 2 2 3 3
#> 3 3 4 4
#> 4 4 NA 4