我有以下数据框,我想创建一个类似下面的数据框。
ID1 ID2 ID3 ID4
x1_X 0 10 4 7
x2_X 2 12 5 8
x3_X 3 1 3 5
y1_Y 4 13 6 4
y2_Y 5 14 1 9
y3_Y 2 11 1 5
y4_Y 1 1 2 3
z1_Z 1 0 0 5
z2_Z 3 6 7 7
新数据框
ID1 ID2 ID3 ID4
X x3 x2 x2 x2
Y y2 y2 y1 y2
Z z2 z2 z2 z2
基本上这个想法如下: 对于每个ID,我想找到哪个rownames(x1_X,x2_X,x3_X)具有最大极值并将其分配给名称X,因为在rownames中我有子组。
我的数据框很大:1700列和100000行。
答案 0 :(得分:0)
你的桌子:
df <- read.table (text= " ID1 ID2 ID3 ID4
x1_X 0 10 4 7
x2_X 2 12 5 8
x3_X 3 1 3 5
y1_Y 4 13 6 4
y2_Y 5 14 1 9
y3_Y 2 11 1 5
y4_Y 1 1 2 3
z1_Z 1 0 0 5
z2_Z 3 6 7 7", header = T)
拆分rownames以获取群组:
library(plyr)
df_names <- ldply(strsplit (rownames(df), "_"))
colnames(df_names) <- c ("group1", "group2")
df2 <- cbind (df, df_names)
创建新表:
df_new <- data.frame (matrix(nrow = length(unique (df2$group2)),
ncol = ncol(df)))
colnames(df_new) <- colnames(df)
rownames (df_new) <- unique (df_names[["group2"]])
使用循环填充新表:
for (i in 1:ncol (df_new)) {
for (k in 1:nrow (df_new)) {
col0 <- colnames (df_new)[i]
row0 <- rownames (df_new)[k]
sub0 <- df2 [df2$group2 == row0, c(col0, "group1")]
df_new [k,i] <- sub0 [sub0[1]==max (sub0[1]), 2]
}
}
答案 1 :(得分:0)
首先,我们需要拆分组和子组标签:
grp <- strsplit(row.names(df), "_")
如果性能问题,我认为data.table是我们的最佳选择:
library(data.table)
df$group <- sapply(grp, "[", 2)
subgroup <- sapply(grp, "[", 1)
dt <- data.table(df)
我们现在可以访问单行:
result <- dt[,lapply(.SD, function(x) subgroup[.I[which.max(x)]]), by=group]
将data.table拆分为下划线(by=group
)后面的字符,然后,对于矩形子集(.SD
)的每一列,我们得到子矩形中的索引(其中.max),然后将其映射回整个data.table(.I),然后提取相关的子组(子组)。
data.table包非常有效,但如果您要多次查询,可能需要查看对data.table的索引。