我找不到这个问题的确切答案,所以我希望我不会重复一个问题.
我有一个数据帧如下
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)
这是你想要的吗 ?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)
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)