每隔一行展开一行,然后合并以在dplyr中追加行名

每隔一行展开一行,然后合并以在dplyr中追加行名,r,dplyr,R,Dplyr,我正在尝试制作不整洁的数据。我有以下格式的数据: name x a NA value 1 b NA value 2 c NA value 3 我希望它是在以下格式 name x a_value 1 b_value 2 c_value 3 如何在dplyr中执行此操作 我的第一个想法是想出一种方法来传播,这样 name name2 x x2 a value NA

我正在尝试制作不整洁的数据。我有以下格式的数据:

name    x
a       NA
value   1 
b       NA
value   2
c       NA
value   3
我希望它是在以下格式

name      x
a_value   1 
b_value   2
c_value   3
如何在dplyr中执行此操作

我的第一个想法是想出一种方法来传播,这样

name    name2        x    x2
a       value       NA     1
b       value       NA     2
c       value       NA     3

从那里我知道我可以使用
unite
进行
name
name2
并删除
x
列,但我不确定
spread
是否可以生成上述内容。

您可以对NA进行分组和总结,即

library(dplyr)

df %>% 
 group_by(grp = cumsum(is.na(x))) %>% 
 summarise(name = paste(name, collapse = '_'))
这就给了,


使用
na.locf
,然后删除不需要的行:

library(dplyr)
library(zoo)

DF %>% 
   mutate(x = na.locf(x, fromLast = TRUE)) %>% 
   filter(name != "value")
给予:

  name x
1    a 1
2    b 2
3    c 3
DF
library(dplyr)
library(zoo)

DF %>% 
   mutate(x = na.locf(x, fromLast = TRUE)) %>% 
   filter(name != "value")
  name x
1    a 1
2    b 2
3    c 3
DF <- 
structure(list(name = structure(c(1L, 4L, 2L, 4L, 3L, 4L), .Label = c("a", 
"b", "c", "value"), class = "factor"), x = c(NA, 1L, NA, 2L, 
NA, 3L)), .Names = c("name", "x"), class = "data.frame", row.names = c(NA, 
-6L))