r-数据的复杂子集



考虑以下数据帧,其中我有7个变量id,A到F

id     A           B          C          D         E         F          
1    5590       23658      523        727       52903     732569
2    24311      421        4319       5597      32695     4521
3    626         623       78

我想要一个新的变量G,其中G只包括a到F中值为5590或421的观测值。

因此,在这种情况下,G只包括id=1和2的观测值。

有什么快速扫描R上的变量A到F的方法吗?

我们可以使用apply

df1$G  <- apply(df1[-1], 1, function(x) intersect(x, c(5590, 421))[1])
dfr <- read.table(text= "5590       23658      523        727       52903     732569
24311      421        4319       5597      32695     4521
24311      431        4319       5597      32695     4521
24311      4211        431239       5597      32695     43521")
dfr <- as.numeric(dfr[,1:6])
#in case it exists remove it.
remove('subsetdfr')
i <- 0
#dim(dfr)[2] automatically output the number of columns of the dataframe
while (i < dim(dfr)[2]){
i <- i+1

if (exists('subsetdfr') == TRUE ) {
#add a row in case subsetdfr exists
subsetdfr <- rbind(subsetdfr,subset(dfr, dfr[i] == 421 | dfr[i] == 5590 )) 
} else {
#create subsetdfr in case it does not exsits
subsetdfr <- data.frame(subset(dfr, dfr[i] == 421 | dfr[i] == 5590 ))
}

}
subsetdfr

这导致:

> subsetdfr
V1    V2   V3   V4    V5     V6
1  5590 23658  523  727 52903 732569
2 24311   421 4319 5597 32695   4521

这是一个快速而简单的解决方案:

dfr[which(grepl("5590|421 ", apply(dfr, 1, paste0, collapse = " "))),]
V1    V2   V3   V4    V5     V6
1  5590 23658  523  727 52903 732569
2 24311   421 4319 5597 32695   4521

它通过在which中的那些行上设置dfr来工作,函数greplpaste中的任意一个数字找到匹配项

最新更新