合并具有最少丰度的行

时间:2018-05-17 08:32:47

标签: r merge

我想合并低于特定值的行,例如:

ID  A   B   C
Apple   1   1   1
Banana  2   2   2
Cherry  3   3   3
Dates   4   4   4

对于Apple,A,B和C中的总量为3,总共为10%(3/30 * 100%= 10%)。

我想将总数低于20%的行合并到“其他”行中,例如:

ID  A   B   C
Cherry  3   3   3
Dates   4   4   4
Others  3   3   3

我可以知道如何绘制函数以及如何实现这个功能吗?

赞赏任何建议或想法

2 个答案:

答案 0 :(得分:1)

一种选择是通过将rowSums数字列除以总sum来创建逻辑索引,以检查它是否小于或等于0.2,然后根据“ID”分配对“其他”的索引(假设“ID”列为character类)和aggregate列的“ID”以获取sum

i1 <- rowSums(df1[-1])/sum(as.matrix(df1[-1])) <= 0.2
df1$ID[i1] <- "Others"
aggregate(.~ ID, df1, sum)
#      ID A B C
#1 Cherry 3 3 3
#2  Dates 4 4 4
#3 Others 3 3 3

答案 1 :(得分:1)

我这样做:

## Your original data
df <- read.table(text="ID  A   B   C
Apple   1   1   1
Banana  2   2   2
Cherry  3   3   3
Dates   4   4   4" ,stringsAsFactors = FALSE)

names(df) <- df[1,] ## adding column names
df <- df[-1,]  ## removing the header row

df[,-1] <- lapply(df[,-1], as.numeric)  ## converting to numeric

rownames(df) <- df[,1]  ## adding rownames
df <- df[,-1]  ## removing the header column

df$tots <- apply(df, 1, sum)
df$proportion <- df$tots/sum(df$tots)
df <- rbind(df[which(df$proportion >= 0.2), ], 
            Others=apply(df[which(df$proportion < 0.2), ], 2, sum))
df <- subset(df, select = -c(tots, proportion))

结果:

>df
>Banana 2 2 2
>Cherry 3 3 3
>Dates  4 4 4
>Others 1 1 1