【问题标题】:Convert a long list to binary dataframe [duplicate]将长列表转换为二进制数据帧[重复]
【发布时间】:2018-05-20 20:07:43
【问题描述】:

输入数据框的格式很长,并且包含一个用户的信息,分为多行。

例子

d_long <- data.frame( nameid = c("sally","sally","sally","Robert","annie","annie"), value = c("product1","ra","ent","ra","ra","product1"))
nameid    value
1  sally product1
2  sally       ra
3  sally      ent
4 Robert       ra
5  annie       ra
6  annie product1

如何将其转换为这样的二进制数据帧:

d_exist <- data.frame(nameid = c("sally","Robert","annie"), product1 = c(1,0,1), ra = c(1,1,1), ent = c(1,0,0))
 nameid product1 ra ent
1  sally        1  1   1
2 Robert        0  1   0
3  annie        1  1   0

【问题讨论】:

  • 试试table table(d_long) or reshape2:: dcast(d_long, nameid ~ value, length) or library(tidyverse);d_long %&gt;% mutate(n = 1) %&gt;% spread(value, n, fill = 0)
  • @akrun 对不起。在回答之前我没有注意到你的评论。我认为您的 cmets 足以回答这个问题。
  • @akrun 非常感谢。在添加答案之前我应该​​保持警惕。我必须在回答中提到你。

标签: r


【解决方案1】:

@akrun 为这个问题提供了相当多的好选项,但其中一个选项可以是使用 tidyr::spread 转换为宽格式。虽然 OP 没有明确提到是否可以多次出现 nameidvalue,但最好为该组包含 count。解决方案如下:

library(tidyverse)

d_long %>% group_by(nameid, value) %>%
  mutate(count = n()) %>%
  ungroup() %>%
  spread(value, count, fill = 0) %>%
  as.data.frame()

#   nameid ent product1 ra
# 1  annie   0        1  1
# 2 Robert   0        0  1
# 3  sally   1        1  1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    相关资源
    最近更新 更多