基于一个列模态和其他列的新列
New columns based on a column modalities and other columns
我找不到这个问题的答案,但也许我看错了关键字,如果是这样,请提前道歉。
基本上我有一个看起来像这样的数据框:
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 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))
请注意,我的真实数据帧比本例中的要长得多,我可能需要一个自动化解决方案
非常感谢!
您可以使用以下解决方案。在这种情况下,我们使用 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
使用 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
具有 reshape
的基本 R 选项可以帮助您
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
我找不到这个问题的答案,但也许我看错了关键字,如果是这样,请提前道歉。 基本上我有一个看起来像这样的数据框:
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 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))
请注意,我的真实数据帧比本例中的要长得多,我可能需要一个自动化解决方案
非常感谢!
您可以使用以下解决方案。在这种情况下,我们使用 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
使用 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
具有 reshape
的基本 R 选项可以帮助您
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