每隔一行传播然后联合以在dplyr中追加行名

时间:2018-02-09 15:33:23

标签: 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中执行此操作?

我的第一个想法是找到spread的方法,以便

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

从那里我知道我可以unite使用namename2并删除列x,但我不确定spread是否可以产生上方。

2 个答案:

答案 0 :(得分:4)

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

import Link from "gatsby-link"

render () {
 <div>
  <Link
   to="/another-page/"
   activeStyle={{
     color: 'red'
   }}
   innerRef={(el) => { this.myLink = el }}
  >
   Another page
  </Link>
 </div>
}

给出,

library(dplyr)

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

数据

# A tibble: 3 x 2
      grp name   
    <int> <chr>  
1     1 a_value
2     2 b_value
3     3 c_value

答案 1 :(得分:2)

使用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 <- 
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))