按行组合,每行中有不同的NA

Mok*_*ire 3 grouping r

我找不到这个问题的确切答案,所以我希望我不会重复一个问题.

我有一个数据帧如下

groupid  col1  col2  col3  col4
   1      0     n     NA     2    
   1      NA    NA    2      2
Run Code Online (Sandbox Code Playgroud)

我想用此传达的是,存在重复的ID,其中总信息分布在两行中,并且我想组合这些行以将所有信息集成到一行中.我该怎么做?

我试图使用group_by和paste但最终会使数据变得更加混乱(例如在col4中获得22而不是2)并且sum()不起作用,因为有些列是字符串而那些不是分类变量并总结他们会改变信息.

在填写NA时,我可以做些什么来折叠行并保持一致的数据不变?

编辑:

抱歉,所需的输出如下:

groupid  col1  col2  col3  col4
   1      0     n     2     2
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 9

这是你想要的吗 ?zoo+ dplyr还查看此处的链接

df %>%
    group_by(groupid) %>%
    mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))%>%filter(row_number()==n())


# A tibble: 1 x 5
# Groups:   groupid [1]
  groupid  col1  col2  col3  col4
    <int> <int> <chr> <int> <int>
1       1     0     n     2     2
Run Code Online (Sandbox Code Playgroud)

EDIT1

没有过滤器,将返回整个数据帧.

    df %>%
        group_by(groupid) %>%
        mutate_all(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))

# A tibble: 2 x 5
# Groups:   groupid [1]
  groupid  col1  col2  col3  col4
    <int> <int> <chr> <int> <int>
1       1     0     n    NA     2
2       1     0     n     2     2
Run Code Online (Sandbox Code Playgroud)

filter在这里,只是切片最后一个,na.locf将继续前一个NA不值,这意味着你的组中的最后一行是你想要的.

同样基于@thelatemail推荐.您可以执行以下操作,给出相同的答案.

df %>% group_by(groupid) %>% summarise_all(funs(.[!is.na(.)][1]))
Run Code Online (Sandbox Code Playgroud)

EDIT2

假设你有冲突,你想要全部展示它们.

df <- read.table(text="groupid  col1  col2  col3  col4
   1      0     n     NA     2    
                 1      1    NA    2      2",
                 header=TRUE,stringsAsFactors=FALSE)
 df
  groupid col1 col2 col3 col4
1       1    0    n   NA    2
2       1    1(#)<NA>    2    2(#)
df %>%
    group_by(groupid) %>%
    summarise_all(funs(toString(unique(na.omit(.)))))#unique for duplicated like col4
  groupid  col1  col2  col3  col4
    <int> <chr> <chr> <chr> <chr>
1       1  0, 1     n     2   2
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 5

just 的另一个选择dplyr是在可用时采用第一个非 NA 值。你可以做

dd <- read.table(text="groupid  col1  col2  col3  col4
1      0     n     NA     2    
1      NA    NA    2      2", header=T)

dd %>% 
  group_by(groupid) %>% 
  summarise_all(~first(na.omit(.)))
Run Code Online (Sandbox Code Playgroud)