将sum应用于按子字符串分组的data.frame,带R

将sum应用于按子字符串分组的data.frame,带R,r,R,样本数据: > mat1 = as.data.frame(matrix(c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2",3,6,5,7,8,4,2,3,4,1,2,3), ncol = 4)); > mat1 V1 V2 V3 V4 1 D-J10-N1 3 8 4 2 D-J10-N2 6 4 1 3 D-J2-N1 5 2 2 4 D-J2-N2 7 3 3 期望输出: > results

样本数据:

> mat1 = as.data.frame(matrix(c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2",3,6,5,7,8,4,2,3,4,1,2,3), ncol = 4));
> mat1
        V1 V2 V3 V4
1 D-J10-N1  3  8  4
2 D-J10-N2  6  4  1
3  D-J2-N1  5  2  2
4  D-J2-N2  7  3  3
期望输出:

> results
        V1 V2 V3 V4
    1 J10  9  12  5
    2 J2   12 5   5
所以我需要将V2和V4相加一个子串V1,然后在结果中返回这个子串。我可以将我的组定义为:

> groups <- substr(mat1[,1],1,5)
> groups
[1] "D-J10" "D-J10" "D-J2-" "D-J2-"
但rowsum似乎只接受组的数值?我查看了apply家族函数,但没有发现运气。。。。有没有办法解决这个问题


非常感谢你的帮助

首先,让我们让您的数据有点不同

mat1 <- data.frame(V1 = c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"),
                   V2 = c(3,6,5,7),
                   V3 = c(8,4,2,3),
                   V4 = c(4,1,2,3))
但是,根据第一列中的数据,您可能希望使用gsub和正则表达式:

gsub('.+-([0-z]+)-.+','\\1',mat1$V1)
或者类似的事情

然后我会查看
plyr

ddply(mat1, .(new.V1), summarise, sums = sum(V2, V3, V4))
或者作为一个丑陋的单行线:

ddply(mat1, .(unlist(lapply(strsplit(mat1$V1, '-'), '[', 2))), summarise, sum(V2, V3, V4))

设置
data.frame
有助于更好地适应列类(目前它们都是因素)


data.table
包适合这种类型的聚合。正如其他人所说,我将重新格式化您的数据,如下所示:

library(data.table)
mat1 <- data.table(V1=c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"),
                   V2=c(3,6,5,7),
                   V3=c(8,4,2,3),
                   V4=c(4,1,2,3),
                   key="V1")
mat1[, lapply(.SD, sum), by=list(V1b=gsub(".*\\-(.*)\\-.*", "\\1", mat1[,V1]))]
#   V1b V2 V3 V4
#1: J10  9 12  5
#2:  J2 12  5  5

lapply(.SD,sum)
部分对每列求和,而
by
部分则根据您请求的子字符串(使用
gsub
和正则表达式)对其进行分组。

(+1)单行程序非常酷。您需要检查
选项(“stringsAsFactors”)
是否未设置为
TRUE
,否则它将在
strsplit
@chl good point中抛出错误。这在我的.Rprofile中,所以我忘记了愚蠢的默认设置。谢谢你的帮助。你的代码符合我的要求,我理解。现在,尝试将其应用于实际数据集时,我得到一个参数必须具有相同的长度错误。我的论据长度合适。修改后的命令:>aggregate(table.off.fem,by=list(sub([D-F]-(J[0-9]+)-[A-Z0-9]+”,“\\1”,rownames(table.off.fem))),sum.str(data)为表中的数字提供int。为什么会出现此错误?>length(table.off.fem[,3])[1]136>length(rownames(table.off.fem))[1]136.数据类型是table,这会导致错误吗?我不能简单地使用Data.frame我的表格….>我真的不明白为什么我得到这个参数必须有相同的长度错误…..
dim(as.Data.frame(table.off.fem))的结果是什么
?我猜我的交叉表有问题,为什么我不能对其进行数据帧处理?原始表中的所有行(来自table.off.fem)都是因子。但无法将其转换为num…错误:(list)无法强制对象键入'double'@Chargaff Its,这与
as.data.frame.table
的工作方式有关。请尝试
df.off.fem
mat1 <- data.frame(V1=c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"),V2=c(3,6,5,7),V3=c(8,4,2,3),V4=c(4,1,2,3))
aggregate(mat1[-1],by=list(sub("D-(J[0-9]+)-[A-Z0-9]+","\\1",mat1$V1)),sum)
  Group.1 V2 V3 V4
1     J10  9 12  5
2      J2 12  5  5
library(data.table)
mat1 <- data.table(V1=c("D-J10-N1","D-J10-N2","D-J2-N1","D-J2-N2"),
                   V2=c(3,6,5,7),
                   V3=c(8,4,2,3),
                   V4=c(4,1,2,3),
                   key="V1")
mat1[, lapply(.SD, sum), by=list(V1b=gsub(".*\\-(.*)\\-.*", "\\1", mat1[,V1]))]
#   V1b V2 V3 V4
#1: J10  9 12  5
#2:  J2 12  5  5