【问题标题】:Subsetting blank rows from data frame in R从R中的数据框中子集空白行
【发布时间】:2013-08-14 06:50:06
【问题描述】:

如果给定列中的行为空白或 NA,我如何从数据框中子集行。例如:

    x <- c(1,2,3,4,"","","")
    y <- c("A","B","C","D","E","F","G")
    z <- c(100,200,300,400,500,600,700)
    xyz <- data.frame(x,y,z)
    View(xyz)

g1 <- subset(xyz, subset=(x > 0))

返回:

警告信息: 在 Ops.factor(x, 0) 中:> 对因子没有意义

如何让它返回一个新数据框,它是原始数据框的子集,但仅包含 X 列大于零的行?

【问题讨论】:

  • subset(xyz,x!="") x y z 1 1 A 100 2 2 B 200 3 3 C 300 4 4 D 400

标签: r dataframe subset


【解决方案1】:

当您创建数据框时,您指定 x 应为因子变量。

(从技术上讲,您指定它应该是字符,但data.frame 已经读懂了您的想法并将其转换为您的因素。同样,从技术上讲,您没有指定它应该是字符,但 R 已经读懂了您的想法并且,因为你试图将数字和字符组合在一个向量中,所以它会将它们全部强制转换为字符模式的向量。)

因此,在这种情况下,“大于零”作为比较运算符没有意义。我将读懂您的想法并得出结论,您实际上希望 x 是数字,但允许值不可用的情况。在这种情况下,你应该这样做

xyz$x <- as.numeric(as.character(xyz$x))
subset(xyz, !is.na(x))

【讨论】:

    【解决方案2】:

    因为x 被存储为一个因子,所以大于一个值在这里没有任何意义。您可以使用索引:

    xyz[xyz$x != "",]
    #   x y   z
    # 1 1 A 100
    # 2 2 B 200
    # 3 3 C 300
    # 4 4 D 400
    

    NA"" 不同,您可以使用is.na() 对其进行逻辑测试。因此,如果这种情况下的值是 NA 而不是 ""xyz[!is.na(xyz$x),] 就可以解决问题

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2018-10-06
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2018-09-23
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多