如何合并一些列?

时间:2019-09-26 03:44:50

标签: r dataframe

我有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,则其他都不是

3 个答案:

答案 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")