我想合并低于特定值的行,例如:
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
我可以知道如何绘制函数以及如何实现这个功能吗?
赞赏任何建议或想法
答案 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