在多个列和行上有效地进行子设置

时间:2015-12-12 17:15:36

标签: r list dataframe subset

我正在尝试将数据子集化以删除具有某些变量值的行。假设我有一个包含许多列和行的数据帧df,我想根据变量G1和G9的值删除行,而我只想保留那些变量取值为1,2或3的行。这样,我的目标是在多个变量上对相同的值进行子集化。

我尝试使用几行代码并以允许快速更改我想要使用的变量或值的方式执行此操作。例如,假设我从数据框df开始,并希望以newdf结束,这排除了G1和G9不接受1,2或3值的观察:

# Naive approach (requires manually changing variables and values in each line of code)
newdf <- df[which(df$G1 %in% c(1,2,3), ]
newdf <- df[which(newdf$G9 %in% c(1,2,3), ]

# Better approach (requires manually changing variables names in each line of code)
vals <- c(1,2,3)
newdf <- df[which(df$G1 %in% vals, ]
newdf <- df[which(newdf$G9 %in% vals, ]

如果我不仅想要G1和G9上的子集,而且想要很多变量,那么这种手动方法的修改非常耗时。我想通过将所有代码合并为一行来进一步简化这一过程。我知道下面的内容有误,但我不确定如何实现替代方案。

newdf <- c(1,2,3)
newdf <- c(df$G1, df$G9) 
newdf <- df[which(df$vars %in% vals, ]

我理解我想使用apply(),但我不确定如何。

2 个答案:

答案 0 :(得分:1)

您不需要使用%in%,它返回布尔值。下面怎么样:

keepies <- (df$G1 %in% vals) & (df$G9 %in% vals)
newdf <- df[keepies, ]

答案 1 :(得分:1)

使用data.table

首先,融化您的数据

library(data.table)

DT <- melt.data.table(df)

然后分成列表

DTLists <- split(DT, list(DT[1:9])) #this is the number of columns that you have. 

现在,您可以使用lapply

递归操作列表
DTresult <- lapply(DTLists, function(x) {
                      ...
                      }