【问题标题】:R: Subset dataframe based on list of allowed factor levelsR:基于允许的因子级别列表的子集数据框
【发布时间】:2015-08-03 09:32:49
【问题描述】:

我正在寻找一个函数来返回数据框中的行mydata

mydata=data.frame(group1=c(rep("MALE",6),rep("FEMALE",6)),group2=c(rep("TREATED",3),rep("UNTREATED",3)))
mydata
   group1    group2
1    MALE   TREATED
2    MALE   TREATED
3    MALE   TREATED
4    MALE UNTREATED
5    MALE UNTREATED
6    MALE UNTREATED
7  FEMALE   TREATED
8  FEMALE   TREATED
9  FEMALE   TREATED
10 FEMALE UNTREATED
11 FEMALE UNTREATED
12 FEMALE UNTREATED

哪些列等于特定因子水平,指定为列表

selection=list(group1="MALE",group2="TREATED")

在本例中,此函数将返回一个包含选定行的向量

c(1,2,3)

不使用循环等的最简单和最快的方法是什么?

PS selection 的列表可以是任意长度,并且我的数据框中可以有任意数量的列,任何名称。

(我知道subset,但这不是我想要的)

编辑:我刚刚做的一个函数如下,但它并不优雅,所以我只是想知道是否已经有任何内置函数可以做我想做的事情:

mydata=data.frame(group1=c(rep("MALE",6),rep("FEMALE",6)),group2=c(rep("TREATED",3),rep("UNTREATED",3)))
selection=list(group1="MALE",group2="TREATED")

selrows=function(mydata,selection) {
nms=names(selection)
sel=data.frame(matrix(TRUE,nrow=nrow(mydata),ncol=length(nms)))
for (i in 1:length(nms)) { sel[,i]=(mydata[,nms[[i]]]==selection[nms[[i]]][[1]]) }
which(apply(sel*1,1,prod)==1)
}

selrows(mydata,selection)
1 2 3

【问题讨论】:

  • 嗯..这不就是with(mydata, mydata[group1 == selection$group1 & group2 == selection$group2, ])吗?
  • 或者只是一个which(mydata$group1 == selection[[1]] & mydata$group2 == selection[[2]])

标签: r select dataframe subset data-manipulation


【解决方案1】:

也许这会有所帮助:

which(mydata[,1] %in% unlist(selection) & mydata[,2] %in% unlist(selection))
#[1] 1 2 3

【讨论】:

  • 是的,但我一直在寻找一种函数,它可以采用任何长度的列表和选择条件,而不仅仅是一个特定的例子
  • 在这种情况下which(mydata$group1 %in% selection[[1]] & mydata$group2 %in% selection[[2]])
  • 仍然不完全 - 事情是我的数据框中的列可以有任何名称,并且仍然可以包含其他数字列 - 即我正在寻找一个通用函数而不是一个特定的解决方案这个特殊的例子
  • 抱歉,但您的可重现示例不清楚,也没有反映您想要的内容。能否再举一个 data.frame 和选择列表的例子?
  • 对不起 - 我添加了一个工作示例,其中包含一个示例函数来做我想做的事情,但我只是想知道是否有更优雅的方法来做这种事情......
猜你喜欢
  • 2020-07-13
  • 2014-02-11
  • 1970-01-01
  • 2020-11-21
  • 2016-12-11
  • 2020-09-12
  • 2015-08-31
  • 2021-06-10
  • 2013-11-26
相关资源
最近更新 更多