我知道有很好的创意子集工具,但我不熟悉它们,所以非常感谢您的帮助。我遇到了类似的问题但找不到答案,但如果您认为这是重复的,请指出我。
让我们假设df
看起来像这样:
Pop Loc BP
1 1 a 10
2 2 a 10
3 3 a 10
4 4 a 10
5 3 a 50
6 2 c 21
7 1 d 33
8 2 d 8
9 3 d 8
10 4 d 8
我想确定哪些Loc
出现在Pop
的所有4个级别中,但考虑Loc
与BP结合使用(即在上面的示例中第5行和第3行不同) 。所需的输出应如下所示:
Pop Loc BP
1 1 a 10
2 2 a 10
3 3 a 10
4 4 a 10
在此示例中,只有df
的前4行符合条件,因为{1}}和Loc=="a"
存在于Pop 1,2,3和4中。
应排除第3行,因为组合BP=="10"
和Loc=="a"
仅存在于Pop 3中,而第7-10行不符合条件,因为BP==50
和{{1在Pop 1中不存在。
解决方案必须具有通用性,或多或少有效,因为Loc=="d"
和BP==8
的真实数据集长度(级别)约为4,000(Loc
仍然很小)。
我正在考虑使用BP
将“Pop
和paste()
”合并到一个新列中,然后只保留那些显示所需次数的列(在此示例中为4个) )。但我确信有更好的方法。
由于
Loc
创建BP
:
dput()
答案 0 :(得分:1)
例如,使用plyr
,您可以创建一个新ID(使用interaction
),然后通过此ID处理您的比较:
library(plyr)
ddply(transform(df,id =interaction(Loc,BP)),.(id),
function(x)if(all(1:4%in%x$Pop))x)
Pop Loc BP id
1 1 a 10 a.10
2 2 a 10 a.10
3 3 a 10 a.10
4 4 a 10 a.10
答案 1 :(得分:1)
使用基础R的非常通用的解决方案,您可以在其中指定分组列,所需值所在的列以及实际所需的值:
subsetCustom <- function(
data,
INDICES,
requiredValueCol,
requiredValues)
{
subsetData <- by(
data = data,
INDICES = INDICES,
FUN = function(subdata, requiredValueCol,
requiredValues) {
if (all(requiredValues %in% subdata[, requiredValueCol]))
out <- subdata
else out <- NULL
return(out)
},
requiredValueCol = requiredValueCol,
requiredValues = requiredValues)
subsetData <- do.call(rbind, subsetData)
return(subsetData)
}
subsetCustom(
data = df,
INDICES = list(df$Loc, df$BP),
requiredValueCol = "Pop",
requiredValues = 1:4)