我有3列,如下所示:
col1 col2 col3
1 NA NA
NA 3 NA
NA NA NA
3 NA NA
我如何将这三列合并成一个新列?
col1 col2 col3 new
1 NA NA 1
NA 3 NA 3
NA NA NA NA
3 NA NA 3
请注意,它们没有交点,这意味着如果其中一个是数字2,则其他都不是
答案 0 :(得分:5)
假设您的数据帧称为df
,
df$new <- pmin(df$col1,df$col2,df$col3,na.rm=TRUE)
应该回答您的问题。
pmin
函数获取每一行三列中的最小值,而na.rm=TRUE
忽略NA值,因此如果按行最多只有一个非NA值,则此行将起作用。
答案 1 :(得分:1)
我们可以使用max.col
来获取每一行的非NA值。
df$new <- df[cbind(seq_len(nrow(df)), max.col(!is.na(df)))]
df
# col1 col2 col3 new
#1 1 NA NA 1
#2 NA 3 NA 3
#3 NA NA NA NA
#4 3 NA NA 3
如果您连续输入多个不等于NA的值,则可能需要根据需要查看ties.method
中的max.col
。
答案 2 :(得分:1)
我们还可以使用coalesce
中的dplyr
library(dplyr)
df1 %>%
mutate(new = coalesce(col1, col2, col3))
# col1 col2 col3 new
#1 1 NA NA 1
#2 NA 3 NA 3
#3 NA NA NA NA
#4 3 NA NA 3
或者不指定列名
df1 %>%
mutate(new = coalesce(!!! .))
或与reduce
library(purrr)
df1 %>%
mutate(new = reduce(., coalesce))
df1 <- structure(list(col1 = c(1L, NA, NA, 3L), col2 = c(NA, 3L, NA,
NA), col3 = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_
)), row.names = c(NA, -4L), class = "data.frame")