【问题标题】:How to subset a large data set with multiple conditions?如何对具有多个条件的大型数据集进行子集化?
【发布时间】:2020-11-03 01:12:06
【问题描述】:

我的完整数据集更大,但我有这个可重现的样本:

structure(list(ID = c("121", "122", "123", "124"), Var1P = c("3", 
"1", "3", "3"), Var1C = c("1", "3", "3", "1"), Var2P = c("1", 
"1", "1", "1"), Var2P = c("1", "1", "1", "1"), Var3P = c("1", 
"1", "1", "1"), Var3C = c("1", "1", "1", "1"), Var4P = c("1", 
"1", "1", "1"), Var4C = c("1", "3", "1", "1"), Var5P = c("1", 
"1", "3", "1"), Var5C = c("1", "1", "1", "1"), Var6P = c("1", 
"1", "1", "1"), Var6C = c("1", "1", "1", "1"), Var7P = c("1", 
"1", "1", "1"), Var7C = c("1", "1", "1", "1"), Var8 = c("0", 
"1", "1", "1")), row.names = c(84L, 150L, 271L, 303L), class = "data.frame")

我想对数据进行子集化,以便仅在 Var1P 或 Var1C 下得分为 3 的观察值以及所有其他列的得分为 2、1 或 0。我尝试使用简单的子集函数:

Data <- subset(Data, Var1P == 3 | Var1C == 3)

但是,我怎样才能使这个论点更加复杂,同时告诉 R 也删除其他列下得分为 3 的条目?

我认为只需使用以下代码即可:

Data <- subset(Data, Var1P == 3 | Var1C == 3 & 4:16 == 1 | 4:16 == 0)

我认为这不是因为 R 会查看行号。我不想输入所有列名,因为就像我说的那样,我的完整数据框要大得多。我也在努力避免循环。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以将数据分成两组列,select_cols 是您要选择其中包含 3 行的列,remove_cols 是其余列。

    然后我们可以选择带有rowSums 的行,其中select_cols 有3,但remove_cols 没有。

    select_cols <- c('Var1P', 'Var1C')
    remove_cols <- setdiff(names(Data), select_cols)
    Data[rowSums(Data[select_cols] == 3) > 0 & rowSums(Data[remove_cols] == 3) == 0, ]
    
    #     ID Var1P Var1C Var2P Var2P Var3P Var3C Var4P Var4C Var5P Var5C Var6P Var6C Var7P Var7C Var8
    #84  121     3     1     1     1     1     1     1     1     1     1     1     1     1     1    0
    #303 124     3     1     1     1     1     1     1     1     1     1     1     1     1     1    1
    

    【讨论】:

    • 我不确定我的想法是否正确,rowSums(Data[remove_cols] == 3) == 0,] 的分数仍然保持在 1,为什么?它并不是从字面上告诉 R 保持数据等于 0,对吧?你的方法效果很好,所以我只是想更好地理解它。
    • rowSums(Data[remove_cols] == 3) == 0,] 告诉 R 选择 remove_cols 中没有 3 个值的行。所以这确保了除了 3 之外没有 3 个值可以存在。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2022-06-18
    • 2018-05-08
    • 2020-04-15
    • 2021-08-01
    相关资源
    最近更新 更多