繁体   English   中英

根据其他列在R中创建多个列

[英]Create multiple columns in R based on other column

我的数据框中有2列,请参考以下内容

no  value
1   A_0.9
1   B_0.8
1   C_0.7
1   D_0.7
2   B_0.9
2   D_0.8
2   A_0.7
2   C_0.7

我想如下创建新的数据框

no  value1  value2  value3  value4
1   A_0.9   B_0.8   C_0.7   D_0.7
2   B_0.9   D_0.8   A_0.7   C_0.7

即:对于“否”列中的每个唯一值,将使用“值”列中的数据创建多个列

t(unstack(df, value ~ no))
#   [,1]    [,2]    [,3]    [,4]   
#X1 "A_0.9" "B_0.8" "C_0.7" "D_0.7"
#X2 "B_0.9" "D_0.8" "A_0.7" "C_0.7"

要整理上面的输出以适合您的数据,

 library(dplyr)
 df1 <- as.data.frame(t(unstack(df, value ~ no)))
 names(df1)[-1] <- paste0('value', 2:ncol(df1)-1)
 rownames(df1) <- NULL
 df1 <- add_rownames(df1, 'no')  #from dplyr package
 #    no value1 value2 value3 value4
 #  (chr) (fctr) (fctr) (fctr) (fctr)
 #1     1  A_0.9  B_0.8  C_0.7  D_0.7
 #2     2  B_0.9  D_0.8  A_0.7  C_0.7

使用data.table ,我们可以使用rleid()通过no为每个唯一value创建一个序列,然后使用它来将数据dcast()转换为宽格式。

library(data.table)
dcast(setDT(df)[, nr := rleid(value),by = no], no ~ nr)
#  no     1     2     3     4
#1  1 A_0.9 B_0.8 C_0.7 D_0.7
#2  2 B_0.9 D_0.8 A_0.7 C_0.7

或者使用data.table开发版本(1.9.7) ,可以实现以下功能,谢谢@Arun!

dcast(setDT(df), no ~ rowid(no, prefix = 'value'))
#   no value1 value2 value3 value4
#1:  1  A_0.9  B_0.8  C_0.7  D_0.7
#2:  2  B_0.9  D_0.8  A_0.7  C_0.7

我将使用reshape库,该库包装了一组不错的数据操作函数。 完成任务的示例:

n = c(1,1,1,1,2,2,2,2)
x = c('A', 'B', 'C', 'D', 'A', 'B', 'C', 'D')
# Just to create the column names you showed in the example
columns = rep(paste("value", 1:4, sep=""), 2)
data = data.frame(n, columns, x)
cast(data, n~columns)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM