根据行中的最极值创建新数据框

时间:2014-04-08 14:39:07

标签: r dataframe rows

我有以下数据框,我想创建一个类似下面的数据框。

     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行。

2 个答案:

答案 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的索引。