Объединение столбцов данных в R - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий фрейм данных,

c1 <- c(1,2,"<NA>","<NA>")
c2 <- c("<NA>","<NA>",3,4)
df <- data.frame(c1,c2)

>df 

    c1   c2
1    1 <NA>
2    2 <NA>
3 <NA>    3
4 <NA>    4

Ниже приведен желаемый вывод, который я пытаюсь получить после объединения столбцов 1, 2

  >df 

    c1  
1    1 
2    2
3    3
4    4

Я пытался,

df <- mutate(df, x =paste(c1,c2))

, что дает

> df
    c1   c2      x
1    1 <NA> 1 <NA>
2    2 <NA> 2 <NA>
3 <NA>    3 <NA> 3
4 <NA>    4 <NA> 4

Может ли кто-нибудь дать рекомендации о том, как получить желаемый результат?

Ответы [ 5 ]

0 голосов
/ 09 сентября 2018

Вы можете использовать rowSums:

data.frame(c1 = rowSums(df,na.rm = TRUE))
#   c1
# 1  1
# 2  2
# 3  3
# 4  4
0 голосов
/ 07 сентября 2018

Другой способ использования dplyr из tidyverse:

df2 <- df %>% 
    mutate(c3 = if_else(is.na(c1),c2,c1)) %>% 
    select(-c1, -c2) %>% # Given you only wanted one column
    rename(c1 = c3) # Given you wanted the column to be called c1

Выход:

  c1
1  1
2  2
3  3
4  4
0 голосов
/ 07 сентября 2018

Вы близки, но вы вставляете вместе две строки, где одна использует строку NA в угловых скобках, чтобы ничего не представлять, и если вы вставляете строки вместе и хотите, чтобы строка не появлялась в вставленной строке, вам нужно иметь ее как строка нулевой длины. Вы можете сделать это, используя команду recode в dplyr.

Вы можете изменить свой код так:

library(dplyr)
df <- mutate(df, x =paste0(recode(c1,"<NA>" = ""),recode(c2,"<NA>" = "")))
0 голосов
/ 07 сентября 2018

Поскольку кажется, что в действительности фрейм данных содержит NA значений, а не '<NA>' строк, я бы предложил использовать coalesce:

c1 <- c(1,2,NA, NA)
c2 <- c(NA, NA,3,4)
df <- data.frame(c1,c2)

library(tidyverse)
df %>% 
  mutate(c3=coalesce(c1, c2))

Выход:

   c1 c2 c3
1  1 NA  1
2  2 NA  2
3 NA  3  3
4 NA  4  4
0 голосов
/ 07 сентября 2018

Одним из способов является это:

c1 <- c(1, 2, NA, NA)
c2 <- c(NA, NA, 3, 4)
df <- data.frame(c1, c2)

df2 <- data.frame(
  c1 = ifelse(is.na(df$c1), df$c2, df$c1)
)

#df2
#  c1
#1  1
#2  2
#3  3
#4  4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...