【问题标题】:How to reshape this dataframe in R program [duplicate]如何在R程序中重塑这个数据框[重复]
【发布时间】:2017-02-06 07:44:47
【问题描述】:

我有一个如下示例的数据框:

      A    B    C   
[1,] "A1" "B3" "C1"
[2,] "A2" "B1" "C2"
[3,] "A3" "B3" "C3"
[4,] "A1" "B2" "C3"
[5,] "A3" "B3" "C2"
[6,] "A1" "B1" "C1"

我想像这样重塑它,将变量的每个唯一值扩展为单个变量,并在值字段中标记 1/0。上面的数据框应该改成这样:

     A    B1    B2    B3    C1    C2    C3       
[1,] "A1" "0"   "0"   "1"   "1"   "0"   "0" 
[2,] "A2" "1"   "0"   "0"   "0"   "1"   "0" 
[3,] "A3" "0"   "0"   "1"   "0"   "0"   "1" 
[4,] "A1" "0"   "1"   "0"   "0"   "0"   "1" 
[5,] "A3" "0"   "0"   "1"   "0"   "1"   "0" 
[6,] "A1" "1"   "0"   "0"   "1"   "0"   "0"  

真实数据量巨大(每天>10万,还有更多的字段和唯一值。所以我需要一个高效的程序而不是使用for...

我相信你能帮上忙...我是初学者,只知道... :(

【问题讨论】:

  • 你确定这是data.frame吗?您显示的输出看起来更像一个矩阵。

标签: r dataframe reshape


【解决方案1】:

你也可以试试这个(base R):

df <- cbind(as.character(df$A), model.matrix(~B+C+0,df,list(B=contrasts(df$B, contrasts=F), 
                                                      C=contrasts(df$C, contrasts=F))))
dimnames(df) <- list(NULL, c('A', paste0('B',1:3), paste0('C',1:3)))
df
 #      A    B1  B2  B3  C1  C2  C3 
 #[1,] "A1" "0" "0" "1" "1" "0" "0"
 #[2,] "A2" "1" "0" "0" "0" "1" "0"
 #[3,] "A3" "0" "0" "1" "0" "0" "1"
 #[4,] "A1" "0" "1" "0" "0" "0" "1"
 #[5,] "A3" "0" "0" "1" "0" "1" "0"
 #[6,] "A1" "1" "0" "0" "1" "0" "0"

【讨论】:

  • 谢谢大家...第一个答案(非常快)向我展示了正确的方法,即使最终结果与预期有些不同~无论如何它是一个样本~所以我想我已经抓住了重点 -感谢@akrun 和其他答案越来越精确,我非常感谢您作为初学者的帮助(而且英语不好)。现在我正在研究其他解决方案,非常感谢~@->-
【解决方案2】:

我们可以使用

library(qdapTools)
cbind(df1[1],  mtabulate(as.data.frame(t(df1[-1]))))
#    A B3 C1 B1 C2 C3 B2
#V1 A1  1  1  0  0  0  0
#V2 A2  0  0  1  1  0  0
#V3 A3  1  0  0  0  1  0
#V4 A1  0  0  0  0  1  1
#V5 A3  1  0  0  1  0  0
#V6 A1  0  1  1  0  0  0

【讨论】:

  • 它没有给出想要的输出,想要的输出是 cbind(df1[, "A"], mtabulate(as.data.frame(t(df1[, -1])))) 或者如果我们想要严格:cbind(A=df1[, "A"], mtabulate(as.data.frame(t(df1[, -1])))[, c(3, 6, 1, 2, 4, 5)]) 并且没有任何解释......
  • FWIW,答案不正确。
  • 所需的输出中没有A1A2A3。就是这样。
  • Cath 已经给了你正确的答案。但无论如何,这是一个骗局(你自己的答案)。
  • cbind 和子集实际上是与欺骗目标的唯一区别。您不能重新打开问题,然后说它无关紧要。选择一个。
猜你喜欢
  • 2021-08-09
  • 2010-12-04
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
相关资源
最近更新 更多