将相关因子匹配到R中的新列中

时间:2017-04-07 03:14:38

标签: r tidyverse

使用下面的数据,我想做一些概括,将带有因子的单个列转换为单独的链接列。在这里'字母'列将创建两个新列' a'和' b'。

data <- data.frame(letters = c("a", "a", "b", "c"),ints = c(1, 2, 1, 1), reals = c(.01, .22, .01, .02))


   letters ints reals
       a    1  0.01
       a    2  0.22
       b    1  0.01
       b    1  0.02

想要返回这样的内容。

 ints   a    b
  1   .01   NA
  2   .22   NA
  1   NA   .01
  1   NA   .02

有没有办法使用tidytext来做到这一点?或者也许扩展这样的东西会起作用:

model.matrix( ints ~ letters + reals, data = data )

3 个答案:

答案 0 :(得分:4)

我认为这就是你想要的,假设你的例子中有一个拼写错误:

reshape(
  transform(data,id=seq_len(nrow(data))),
  idvar=c("id","ints"), timevar="letters", direction="wide"
)
#  ints id reals.a reals.b
#1    1  1    0.01      NA
#2    2  2    0.22      NA
#3    1  3      NA    0.01
#4    1  4      NA    0.02

答案 1 :(得分:3)

我们可以使用dcast

中的data.table执行此操作
library(data.table)
dcast(setDT(data), ints +rowid(ints) ~ letters, value.var = "reals")[order(ints_1)
       ][, ints_1 := NULL][]
#   ints    a    b
#1:    1 0.01   NA
#2:    2 0.22   NA
#3:    1   NA 0.01
#4:    1   NA 0.02

答案 2 :(得分:1)

您的letters变量中不应该存在 c ,就像您在data.frame中显示的那样。

如果您有许多字母

,则可以使用dplyrtidyr来执行此操作
data1 <- data %>% 
  dplyr::mutate(id=seq_len(nrow(.))) %>% 
  tidyr::spread(letters, reals) %>% 
  dplyr::arrange(id)

> data1
  ints id    a    b
1    1  1 0.01   NA
2    2  2 0.22   NA
3    1  3   NA 0.01
4    1  4   NA 0.02

或者如果你只有两个字母a和b,你也可以使用ifelse。

library(dplyr)
data1 <- data %>% 
  dplyr::mutate(a = ifelse(letters=="a"&ints%in%c(1,2), reals, NA),
                b = ifelse(letters=="b"&ints==1, reals, NA))

> data1
  letters ints reals    a    b
1       a    1  0.01 0.01   NA
2       a    2  0.22 0.22   NA
3       b    1  0.01   NA 0.01
4       b    1  0.02   NA 0.02