基于列模态和其他列创建新列

3

我可以帮您翻译这篇与IT技术相关的文章,如果我的关键词不当,请您谅解。 基本上,我有一个数据框看起来像这样:

  code class Var1 Var2
1   U1     A    1    3
2   U2     A    5   43
3   U1     B    6    3
4   U2     B    6   12
5   U1     C   87    7
6   U2     C    1    8

以下代码可以重现:

df <- data.frame(code=c("U1","U2","U1","U2","U1","U2"),class = c("A","A","B","B","C","C"), Var1 = c(1,5,6,6,87,1), Var2 = c(3,43,3,12,7,8))

我想通过创建基于“Class”列模态和其他列的新列,使其看起来像这样,同时保持“Code”列不变:

  Code Var1.A Var2.A Var1.B Var2.B Var1.C Var2.C
1   U1      1      3      6      3     87      7
2   U2      5     43      6     12      1      8

这个第二个数据框可以通过以下代码进行复制:
df2 <- data.frame(Code=c("U1","U2"),Var1.A = c(1,5), Var2.A = c(3,43), Var1.B = c(6,6),Var2.B=c(3,12),Var1.C=c(87,1),Var2.C=c(7,8))

请注意,我的真实数据框比此示例中的要长得多,我可能需要一种自动化解决方案。
非常感谢!
3个回答

5
你可以使用以下解决方案。在此情况下,我们使用glue语法创建自定义列名。.value是我选择的值列名称,class是先前存储在class列中的值,它们之间用一个字面上的点.连接如下:
library(tidyr)

df %>%
  pivot_wider(names_from = "class", values_from = c("Var1", "Var2"), 
              names_glue = "{.value}.{class}")

# A tibble: 2 x 7
  code  Var1.A Var1.B Var1.C Var2.A Var2.B Var2.C
  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 U1         1      6     87      3      3      7
2 U2         5      6      1     43     12      8

1
是的!晚了5秒。恭喜! - TarJae
1
哈哈,快点发表你的答案吧,今天对我来说过得相当平静 :D - Anoushiravan R
1
这跟我之前从你的帖子中学到的“胶水”完全一样。它非常完美,我的朋友! - TarJae
嗨,你在使用pivot_wider之前尝试过按code进行分组吗?你的原始数据中是否有任何在示例中没有出现的特征? - Anoushiravan R
1
谢谢,是因为我有一个多余的“class”列,用文字定义了每个班级的编号,最后通过删除该列使其正常工作!问题解决了,再次感谢。 - mona
显示剩余3条评论

1

使用data.table中的dcast

library(data.table)
dcast(setDT(df), code ~ class, value.var = c("Var1", "Var2"), sep=".")
   code Var1.A Var1.B Var1.C Var2.A Var2.B Var2.C
1:   U1      1      6     87      3      3      7
2:   U2      5      6      1     43     12      8

1

使用基本的R选项和reshape函数可以帮助您。

reshape(
  df,
  direction = "wide",
  idvar = "code",
  timevar = "class"
)`

这提供了

  code Var1.A Var2.A Var1.B Var2.B Var1.C Var2.C
1   U1      1      3      6      3     87      7
2   U2      5     43      6     12      1      8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接