R:通过替换NA行将多个字符列合并为一个

时间:2016-09-13 13:29:51

标签: r

我有一个由字符变量组成的数据框,如下所示:

   V1             V2   V3   V4   V5
1  ID           Date pic1 pic2 pic3
2   1 15.06.16 11:50  abc <NA>  def
3   1 16.06.16 11:19 <NA>  hij <NA>
4   1 17.06.16 11:41 <NA> <NA>  nop
5   2 28.05.16 11:40  tuv <NA> <NA>
6   2 29.05.16 11:39 <NA>  zab <NA>
7   2 30.05.16 09:07 <NA> <NA>  wxy
8   3 03.06.16 07:31  lmn <NA> <NA>
9   3 04.06.16 11:01 <NA>  rst <NA>
10  3 05.06.16 13:57 <NA> <NA>  opq

因此,每天一个pic变量包含一个值,其余的是NA。 现在我想通过替换NA来将所有pic值组合成一个变量。对不起,如果这是一个dublicate,我已经尝试了很多建议的解决方案,但到目前为止没有任何工作。 谢谢!

2 个答案:

答案 0 :(得分:1)

我们可以尝试使用data.table。将'data.frame'转换为'data.table'(setDT(df1),按'ID'分组,'Date',我们unlist将Subset of Data.table(.SD)转换并省略NA元素(na.omit

library(data.table)
setDT(df1)[, .(pic = na.omit(unlist(.SD))), by = .(ID, Date)]
#    ID           Date pic
# 1:  1 15.06.16 11:50 abc
# 2:  1 15.06.16 11:50 def
# 3:  1 16.06.16 11:19 hij
# 4:  1 17.06.16 11:41 nop
# 5:  2 28.05.16 11:40 tuv
# 6:  2 29.05.16 11:39 zab
# 7:  2 30.05.16 09:07 wxy
# 8:  3 03.06.16 07:31 lmn
# 9:  3 04.06.16 11:01 rst
#10:  3 05.06.16 13:57 opq

如果每行只有一个非NA

,则另一个选项是pmax
setDT(df1)[, pic := do.call(pmax, c(.SD, na.rm = TRUE)),
         .SDcols = pic1:pic3][, paste0("pic", 1:3) := NULL][]

或使用dplyr

library(dplyr)
df1 %>%
     mutate(pic = pmax(pic1, pic2, pic3, na.rm=TRUE))%>% 
     select(-(pic1:pic3))

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), Date = c("15.06.16 11:50", 
"16.06.16 11:19", "17.06.16 11:41", "28.05.16 11:40", "29.05.16 11:39", 
"30.05.16 09:07", "03.06.16 07:31", "04.06.16 11:01", "05.06.16 13:57"
), pic1 = c("abc", NA, NA, "tuv", NA, NA, "lmn", NA, NA), pic2 = c(NA, 
"hij", NA, NA, "zab", NA, NA, "rst", NA), pic3 = c("def", NA, 
"nop", NA, NA, "wxy", NA, NA, "opq")), .Names = c("ID", "Date", 
"pic1", "pic2", "pic3"), row.names = c(NA, -9L), class = "data.frame")

答案 1 :(得分:0)

假设

  

每天一个pic变量包含一个值,其余的是NA

您可以使用coalesce中的dplyr来获得您想要的内容:

library(dplyr)
result <- df1 %>% mutate(pic = coalesce(pic1, pic2, pic3)) %>% 
                  select(-(pic1:pic3))

使用akrun提供的数据:

print(result)
##  ID           Date pic
##1  1 15.06.16 11:50 abc
##2  1 16.06.16 11:19 hij
##3  1 17.06.16 11:41 nop
##4  2 28.05.16 11:40 tuv
##5  2 29.05.16 11:39 zab
##6  2 30.05.16 09:07 wxy
##7  3 03.06.16 07:31 lmn
##8  3 04.06.16 11:01 rst
##9  3 05.06.16 13:57 opq
相关问题