【问题标题】:Subsetting efficiently on multiple columns and rows在多列和多行上有效地进行子集化
【发布时间】:2016-03-18 11:54:56
【问题描述】:

我正在尝试对我的数据进行子集化,以删除具有某些变量的某些值的行。假设我有一个包含许多列和行的数据框 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(),但我不确定如何使用。

【问题讨论】:

  • 请提供要操作的数据集。 MWE(最小工作示例)使我们能够提供简明的答案。

标签: r list dataframe subset


【解决方案1】:

您不需要将 which 与 %in% 一起使用,它会返回布尔值。下面的呢:

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

【讨论】:

  • 这不是我想要的,因为如果我有大量变量(例如 G1、G2、G3...Gn,其中 n 很大),它仍然需要大量代码。我希望创建一个变量名向量: vars
  • 下面的代码怎么样。您可以调整为仅使用您想要的列,但这仍然假设将使用相同的 val。 df[apply(apply(df, 2, function(x) x %in% vals), 1, all), ]
【解决方案2】:

使用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) {
                      ...
                      }

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多