【问题标题】:Can't `filter()` a numeric column even though `r` says it is a number (`typeof()` is "double")不能 `filter()` 一个数字列,即使 `r` 说它是一个数字(`typeof()` 是“double”)
【发布时间】:2021-10-16 00:14:34
【问题描述】:

我是r 的新手,但我环顾四周并尝试了我能想到的一切。这是一步一步的:

  • 将 Qualtrics 中的数据提取到 csv 中
  • 使用read_csv()(使用read.csv() 更难)删除所有(在这种情况下为3)标题行并将一个保存到names()
  • 使用read_csv 提取数据并使用names() 分配标头
  • 根据其数值过滤Duration (in seconds) 不起作用。也就是说,`filter('Duration (in seconds)' == 0) 产生一个没有观察的数据帧。

我有:

  • 已成功过滤其他数值列
  • 已验证 typeof(test$'Duration (in seconds)') 为“double”
  • 已验证 read_csv() 将“持续时间(以秒为单位)”导入为双精度(即 'Duration (in seconds)' = col_double()

示例代码

df_names <- read_csv("file.csv", n_max=0) %>% names()
test <- read_csv("file.csv", skip=3, col_names=df_names, trim_ws = T)
test2 <- test %>% filter('Duration (in seconds)' == 0) #no rows but should be 6
test2 <- test %>% filter('Duration (in seconds)' > 0) #all rows but should be 3

数据:file.csv

【问题讨论】:

    标签: r csv dplyr qualtrics readr


    【解决方案1】:

    在引用变量名时尝试用反引号替换引号:

    test2 <- test %>% filter(`Duration (in seconds)` == 0) #no rows but should be 6
    test2 <- test %>% filter(`Duration (in seconds)` > 0) #all rows but should be 3
    

    说明:引号表示R中的字符串;由于您的列不是字符串,因此您的原始过滤器命令不会选择您想要的列,因此不会在过滤后的数据框中返回任何行。

    反引号在 R 中有 a few uses,但其中之一是为您提供一种引用非语法名称的方式。在此示例中,我们需要使用反引号,因为您的列名中有空格。如果我们不这样做,R 会假设 Duration (in seconds) 中的每个单词都是一个单独的对象,这将是非语法的并引发错误。

    【讨论】:

    • 谢谢! @Rory S,您介意解释一下为什么列名会在这里引起问题以及为什么反引号可以解决它吗?我想编辑并重新标记或链接到重复的答案,以便其他人可以找到问题,但我不知道如何称呼我的问题。当然,通过这么简单的修复,这是一个常见问题。
    • @BobIsahofferer 没问题!刚刚编辑了我的答案,以解释为什么反引号在这里起作用 - 希望这已经足够清楚了。
    【解决方案2】:

    使用来自base Rsubset

    subset(test, `Duration (in seconds)` == 0)
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2014-08-08
      • 2020-08-16
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多