如何将列数据传播到rownames

时间:2017-05-02 16:24:10

标签: r dataframe

我想传播name列。

d <- data.frame(ID = c(1,1,2,2,2,3,3), 
                name = c("a", "b", "a", "c", "d","c","d"))

|  ID | name |
|-----|------|
|  1  |  a   |
|  1  |  b   |
|  2  |  a   |
|  2  |  c   |
|  2  |  d   |
|  3  |  c   |
|  3  |  d   |

使用tidyr::spread()可以在data.frame

下使用
d %>% tidyr::spread(name,name) 
| ID| a | b | c | d |
| 1 | a | b | NA| NA|
| 2 | a | NA| c | d |
| 3 | NA| NA| c | d |

但我希望得到这样的data.frame。

|  ID | name1 | name2 | name3 |
|-----|-------|-------|-------|
|  1  |   a   |  b    | NA    |
|  2  |   a   |  c    |   d   |
|  3  |   c   |  d    | NA    |

1 个答案:

答案 0 :(得分:2)

我们可以创建一个新列spread

library(tidyverse)
d %>%
  group_by(ID) %>% 
  mutate(new = paste0("name", row_number())) %>%
  spread(new, name)
#    ID  name1  name2  name3
#* <dbl> <fctr> <fctr> <fctr>
#1     1      a      b     NA
#2     2      a      c      d
#3     3      c      d     NA

dcast

相对简洁
library(data.table)
dcast(setDT(d), ID~paste0("name", rowid(ID)), value.var = "name")