将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