我的表格格式符合
Class1 0.438 0.441 0.442 0.444 0.545 0.546 0.548 0.609 0.651 0.652 0.655
DAWO 2 2 0 1 0 0 0 1 1 5 1
DRWO 1 1 3 1 1 1 1 0 0 1 0
DHWO 1 2 0 0 0 0 0 0 0 0 0
我想通过根据列名称和列合并列来减少表的维度。添加值。 E.g
Class1 0.4 0.5 0.6
DAWO 5 0 8
DRWO 6 3 1
DHWO 3 0 0
这怎么可能? 在此先感谢您的帮助
答案 0 :(得分:1)
x <- read.table(header=TRUE, text=" 0.438 0.441 0.442 0.444 0.545 0.546 0.548 0.609 0.651 0.652 0.655
DAWO 2 2 0 1 0 0 0 1 1 5 1
DRWO 1 1 3 1 1 1 1 0 0 1 0
DHWO 1 2 0 0 0 0 0 0 0 0 0 ", check.names=F)
请注意,我没有复制文本Class1
,因此DAW0
等是原始集中的行名。
首先,使用移调来帮助aggregate
:
tx <- as.data.frame(t(x))
这些是削减。假设值介于0和1之间。根据需要进行调整。
tx$bin <- cut(as.numeric(rownames(tx)), breaks=seq(0,1,.1))
添加值,设置名称,然后再转置:
xx <- aggregate(.~bin, data=tx, FUN=sum)
rownames(xx) <- xx$bin
t(xx[-1])
## (0.4,0.5] (0.5,0.6] (0.6,0.7]
## DAWO 5 0 8
## DRWO 6 3 1
## DHWO 3 0 0
答案 1 :(得分:1)
这是另一种选择。使用@ Matthew的答案中的“x”,您可以使用strtim
从您的姓名中创建类别,并使用sapply
来汇总这些类别。
mymatch <- strtrim(names(x), 3)
sapply(unique(mymatch), function(y) rowSums(x[, mymatch == y, drop = FALSE]))
# 0.4 0.5 0.6
# DAWO 5 0 8
# DRWO 6 3 1
# DHWO 3 0 0
或者,使用您的原始数据,您只需要小心谨慎,在记下rowSums
时放弃“Class1”列:
mymatch <- strtrim(names(mydf), 3)[-1]
cbind(mydf[1],
sapply(unique(mymatch),
function(y) rowSums(mydf[-1][, mymatch == y, drop = FALSE])))
# Class1 0.4 0.5 0.6
# 1 DAWO 5 0 8
# 2 DRWO 6 3 1
# 3 DHWO 3 0 0
最后,有一个经典的“reshape2”方法涉及melt
和*cast
:
> library(reshape2)
> Stacked <- melt(mydf)
Using Class1 as id variables
> dcast(Stacked, Class1 ~ strtrim(variable, 3), fun.aggregate=sum)
Class1 0.4 0.5 0.6
1 DAWO 5 0 8
2 DHWO 3 0 0
3 DRWO 6 3 1
对于最后两个示例,mydf
定义为:
mydf <- structure(list(Class1 = structure(c(1L, 3L, 2L), .Label = c("DAWO",
"DHWO", "DRWO"), class = "factor"), `0.438` = c(2L, 1L, 1L),
`0.441` = c(2L, 1L, 2L), `0.442` = c(0L, 3L, 0L), `0.444` = c(1L,
1L, 0L), `0.545` = c(0L, 1L, 0L), `0.546` = c(0L, 1L, 0L),
`0.548` = c(0L, 1L, 0L), `0.609` = c(1L, 0L, 0L), `0.651` = c(1L,
0L, 0L), `0.652` = c(5L, 1L, 0L), `0.655` = c(1L, 0L, 0L)),
.Names = c("Class1", "0.438", "0.441", "0.442", "0.444", "0.545", "0.546",
"0.548", "0.609", "0.651", "0.652", "0.655"), class = "data.frame",
row.names = c(NA, -3L))