【问题标题】:How to easily subset for specific data in a dataframe?如何轻松地对数据框中的特定数据进行子集化?
【发布时间】:2020-10-20 01:13:30
【问题描述】:

我有以下数据框:

Data <- structure(list(ID = c(101, 102, 103, 104, 105, 106
), V1 = c(1, 3, 3, 1, 1, 1), V2 = c(1, 1, 
1, 1, 1, 1), V3 = c(3, 1, 1, 1, 1, 1), V4 = c(1, 
1, 1, 1, 1, 1)), row.names = c(NA, 6L), class = "data.frame")

我想对变量 V1、V2、V3 或 V4 值为 3 或更高的条目进行子集化。他们可以在一个变量或多个变量中获得 3 或更高的分数,但他们至少需要一个。

我目前使用的方法如下所示:

set <- grep('V', names(Data))
Data <- Data[rowSums(Data[set] > 2) > 0, set]

我几乎得到了我需要的东西,但我缺少列 ID。

我想我可以创建一个名为 keep 的值来保留 ID 并稍后将它们添加到数据框中,所以我尝试了。

keep <- Data$ID

在使用 c() 函数并命名新列时不起作用,因为替换行不匹配。所以我尝试了这个

keep <- as.data.frame(keep)
Data <- merge(Data, keep, by=c('ID')

这当然给了我一个错误,因为我忘记了 Data 没有要合并的现有 ID 列。

所以现在我正在寻找一种方法来将 ID 保留在一个步骤中,或者将 ID 包含在步骤中,以便在早期获得 3 分或更高的分数。

【问题讨论】:

  • Data &lt;- Data[rowSums(Data[set] &gt; 2) &gt; 0, ]
  • 或者,如果还有其他变量你还想删除,Data &lt;- Data[rowSums(Data[set] &gt; 2) &gt; 0, c("ID", set)]
  • Data[which(Data[set] &gt;= 3, arr.ind = TRUE)[,"row"],]

标签: r subset


【解决方案1】:
library(dplyr)
Data %>% filter_at(vars(-ID), any_vars(. >= 3))
# OR
Data %>% filter_at(vars(starts_with("V")), any_vars(. >= 3))

【讨论】:

    【解决方案2】:

    这对你有用吗?

    df_sub <- subset(Data, V1>=3 | V2>=3| V3>=3)
    

    所以结果是

       ID V1 V2 V3 V4
    1 101  1  1  3  1
    2 102  3  1  1  1
    3 103  3  1  1  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多