0
我有一个数据框,需要根据定义的组进行折叠。数据由数百个组组成。每个组可以有2-5行的任何地方。为了简单起见,我的例子显示了3组2-4行。使用数据帧列表的规则合并数据
我想扁平每个组内的复制品。对于组中的每一列,我想返回不是NA的最大出现值。问题在于如何在平局的情况下做什么。对于关系,我需要根据绑定的值的类型设置自定义规则。一个潜在的绝望选择是将绑定值粘贴在一起,用逗号分隔,我可以用find/replace方式处理它们。
为了获得最大值,我可以使用max函数。有关如何处理关系的建议?
#Input Data Example
> data
Group Loc1 Loc2 Loc3 Loc4
1 Group1 A/B A/A B/B NA
2 Group1 A/B A/A B/B A/A
3 Group1 A/A A/A A/A NA
4 Group1 A/A A/A A/A NA
5 Group2 A/A NA C/C B/B
6 Group2 B/B A/A C/C B/B
7 Group2 B/B A/A C/C B/B
8 Group3 B/B B/B NA B/B
9 Group3 B/B B/B NA A/A
#Desired Collapsed Output
> data.collapsed
Group Loc1 Loc2 Loc3 Loc4
1 Group1 NA A/A A/B A/A
2 Group2 B/B A/A C/C B/B
3 Group3 B/B B/B NA A/B
最终代码(更新一月27,2015)
library(data.table)
#Data Frame
#Each group has replicates of data that need to be collapsed to make a consensus data replicate
data = rbind(c("Group1","A/B", "A/A","B/B",NA), c("Group1","A/B", "A/A","B/B","A/A"), c("Group1","A/A", "A/A","A/A",NA),
c("Group1","A/A", "A/A","A/A",NA), c("Group2","A/A", NA,"C/C","B/B"), c("Group2","B/B", "A/A","C/C","B/B"),
c("Group2","B/B", "A/A","C/C","B/B"), c("Group3","B/B", "B/B",NA,"B/B"), c("Group3","B/B", "B/B",NA,"A/A"))
colnames(data) = c("Group", "Loc1", "Loc2", "Loc3", "Loc4")
data = as.data.frame(data)
data
#Define acceptable value types; these could be used to define what to do in the case of a tie
same.letter = c("A/A","B/B","C/C")
diff.letter = c("A/B","A/C","B/C")
#Function for collapsing data with rules
RepMerge = function(col) {
z = table(col);
z.max = which(z==max(z));
ifelse(length(z.max) > 2, "NA", #if tied between more than 2 different values, report NA
ifelse(length(z.max) == 1, names(z)[z.max], #if one max value, report that value
ifelse(length(z.max) == 2 & names(z)[z.max][1] %in% same.letter & names(z)[z.max][2] %in% same.letter, paste(substring(names(z)[z.max][1],1,1),substring(names(z)[z.max][2],1,1), sep="/"), #if both max values are different but are in 'same.letter', report a combination
ifelse(length(z.max) == 2 & names(z)[z.max][1] %in% diff.letter | names(z)[z.max][2] %in% diff.letter, "NA", "Check Code")))) #if one of the max values is in diff.letter, report NA. If no cases fit the above, report "Check Code"
}
setDT(data)[,lapply(.SD,RepMerge),Group] # run function to collapse the data
谢谢 SC2
关于“不适用”,是的,我想到,当我今天早上醒来:-)。我会在我的帖子中纠正它。感谢您的建议,我会尝试一下,让您知道它是如何工作的。谢谢! – SC2 2015-01-27 13:39:24