【问题标题】:How can I remove all variables that do not have multiple distinct observations in R?如何删除在 R 中没有多个不同观察值的所有变量?
【发布时间】:2013-05-06 17:55:53
【问题描述】:

我有一个包含多个变量的数据集,这些变量只有一个独特的观察结果(例如,对于数据集中的每个观察结果,变量 Language 等于“英语”)。我试图编写一个函数来自动找到这种性质的任何变量并将其从数据框中删除。以下代码有效,但我确信有一种更有效的方法。有什么想法吗?

test.df <- data.frame(var1=rep("a",5), var2=c(rep("a",3),rep("b",2)),
                      var3=1:5, var4=rep(0,5)) 

remove.repeat.vars <- function(data) {
  one.level.factors <- sapply(data, function(x) ifelse(length(unique(x)) < 2, 1, 0))
  one.level.factors <- names(one.level.factors[which(one.level.factors == 1)])
  return (data[,-which(names(data) %in% one.level.factors)])
}

 remove.repeat.vars(test.df)

【问题讨论】:

    标签: r


    【解决方案1】:

    一个班轮:

    test.df[, sapply(test.df, function(x) length(unique(x)) > 1)]
    

    这就是它起作用的原因。 R 支持两种不同的方式来索引向量:使用索引向量(任意长度)或使用布尔向量。比较:

    > x <- 6:10
    > x[c(1,3,5)]
    [1]  6  8 10
    > x[c(TRUE, FALSE, FALSE, TRUE, FALSE)]
    [1] 6 9
    

    第二个原因是为什么 x[x&gt;7] 这样的东西会起作用。

    【讨论】:

    • 太棒了。所以 sapply 吐出一个逻辑向量,您使用子集括号仅选择逻辑为“TRUE”的列。我尝试了很多这样的事情,但无法让它发挥作用,但现在它就在我面前,我不敢相信我需要帮助。
    • +1 不错的答案。然而,这种解释并不完全准确。 R 支持多种索引方式,布尔向量不需要长度相同。适用标准回收规则;)例如:获取所有奇数到 N:seq(N)[c(TRUE, FALSE)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多