【问题标题】:Remove rows from data.frame from continuous data containing symbols从包含符号的连续数据中删除 data.frame 中的行
【发布时间】:2018-11-09 23:25:06
【问题描述】:

我有一个 data.frame,其中有一列应该包含连续数据。但是,有些行的值带有 '~' 和 '

c.a <- c(1,5,3,7,4,9,2,3,7)
c.b <- c("a", "c", "f", "s", "r", "q", "w", "e", "t")
c.d <- c(1,4,6, '<5', '~34', 65, 45, 2, 6)
x <- data.frame(c.a, c.b, c.d)

目标是从 data.frame x 中删除第 4 行和第 5 行

希望这不是一个重复的问题,但我已经快速搜索并找不到解决方案。提前致谢。

【问题讨论】:

  • 谢谢大家。所有 cmets 都为感兴趣的人提供了正确的解决方案。

标签: r dataframe symbols


【解决方案1】:

您可以使用grepl()进行过滤:

x[grepl(x=as.numeric(x$c.d),"[^\\d]"), ]

输出:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
4   9   q  65
5   2   w  45
6   3   e   2
7   7   t   6

【讨论】:

  • 我得到的和上面的评论一样。代码似乎没有给我相同的输出。
  • 你是说如果你在你的帖子中复制你的示例代码,然后运行我和 chinsoon 给出的解决方案,你没有得到我们发布的输出吗?如果是这样,我会同意 chinsoon 的评论 - 尝试重新开始您的 R 环境。这两种解决方案都按照我的演示工作,它只是基础 R,所以不应该有任何包问题。 (如果还是不行,你能描述一下你看到的输出吗?)
  • andrew_reece 和 @chinsoon12 感谢您的帮助。是的。我在 R 中尝试过,重新启动它,也在 RStudio 中尝试过。没有加载任何包。在运行该行之前,我的输出与“x”完全相同。它也不适用于我的完整数据集。
【解决方案2】:

您可以尝试转换为数字并丢弃非数字的那些

x[!is.na(as.numeric(as.character(x$c.d))),]

输出:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6

【讨论】:

  • 抱歉输出不是你想要的? "从 data.frame x 中删除第 4 行和第 5 行"
  • 您给出的输出正是我想要的,但是当我运行它时,您的代码并没有给我那个结果。不知道为什么?
  • 也许重新启动您的 R。您的 x 可能与您发布的数据帧不同。对变量使用通用名称有时会导致问题
  • @chriskaye 它做了什么?需要知道我们是否要诊断问题
  • @griffinevo 是的,问题已解决。请参阅上述解决方案。谢谢:-)
【解决方案3】:

我认为,如果您没有关闭stringsAsFactors = F,您可能无法获得想要的结果,您可以在创建数据框时执行此操作:

x <- data.frame(c.a, c.b, c.d, stringsAsFactors=F)
x$c.d <- as.numeric(x$c.d)
x[complete.cases(x),]

您也可以在代码顶部添加options(stringsAsFactors=F),这将在许多情况下为您提供帮助(如果适合您,您可以选择使用)。

运行上面的代码应该会给你想要的输出。

你可以使用这个解决方案(感谢@Onyambu):

na.omit(transform(x,c.d=as.numeric(c.d))) 

【讨论】:

  • na.omit(transform(x,c.d=as.numeric(c.d)))
【解决方案4】:

转换the factor to a numeric (as.numeric(levels(x[, 'c.d']))[x[, 'c.d']]),然后将 NA 从数据框中索引出来:

x <- x[!is.na(as.numeric(levels(x[, 'c.d']))[x[, 'c.d']]), ]

这会产生一条警告消息(warnings ≠ errors),您可以忽略它(它给出的原因是转换非数字字符会产生 NA,但这正是我们希望它在此处执行的操作)。

Warning message:
In `[.data.frame`(x, !is.na(as.numeric(levels(x[, "c.d"]))[x[, "c.d"]]),  :
  NAs introduced by coercion

这就是结果,正如你所要求的:

  c.a c.b c.d
1   1   a   1
2   5   c   4
3   3   f   6
6   9   q  65
7   2   w  45
8   3   e   2
9   7   t   6

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多