【问题标题】:Subset complicated dataset子集复杂数据集
【发布时间】:2020-05-15 17:21:29
【问题描述】:

我有一个数据集:

x     y
A1  '*****'
A2  '123,0'
A3  '4557777'
A4  '8756784321675'
A5  'ЯРН'
A6  ''
A7  
A8

我想删除除 y 列中的值仅由数字组成或为空(不是 '',而是 NA)的行之外的所有行。所以想要的输出是这样的:

x     y
A3  '4557777'
A4  '8756784321675'
A7  
A8

我怎么能这样做?如您所见,有一个带有西里尔字母“ЯРН”的值。这是最不清楚的部分。用逗号我试过这个:

df[!grepl(",", df$y),]

但是如何对待别人

【问题讨论】:

  • @IanCampbell empty 是 NA,'' 不是空的,它的两个撇号

标签: r dataframe subset


【解决方案1】:

即使使用西里尔符号,以下解决方案也适用,它利用了这样一个事实,即强制不是所有数字的字符串都会产生NA's。

tmp <- gsub("'", "", df1$y)
i <- !is.na(suppressWarnings(as.numeric(tmp)))
j <- df1$y == "" | is.na(df1$y)
df1[i | j, ]
#   x               y
#3 A3       '4557777'
#4 A4 '8756784321675'
#7 A7                
#8 A8    

数据

df1 <- read.table(text = "
x     y
A1  '*****'
A2  '123,0'
A3  '4557777'
A4  '8756784321675'
A5  'ЯРН'
A6  ''
A7  
A8
", header = TRUE, fill = TRUE, quote = "\"")

【讨论】:

  • 可能需要添加对 as.character 的调用,以防几年后有人带着因子而不是字符向量来。
【解决方案2】:
suppressWarnings(df[!is.na(as.numeric(df$y)) | is.na(df$y), ])

【讨论】:

  • 会有与此相关的警告。你可以压制他们
  • 虽然'的存在存在一些问题
【解决方案3】:

由于您的数据似乎包含',您可以这样做:

subset(df, grepl("^'?\\d+'?$",y) | is.na(y))

【讨论】:

  • 好收获。我没有意识到 OP 有实际的's。
【解决方案4】:

这是一种基于 R 的方法:

您使用"'\\d+'" 模式来查找以' 开头、有一个或多个数字然后以' 结尾的字符串。

df[grepl("'\\d+'",df$y) | is.na(df$y),]
   x             y
3 A3       '4557777'
4 A4 '8756784321675'
7 A7           <NA>
8 A8           <NA>

【讨论】:

  • 它还删除了像 A3 '4557777' 和 A4 '8756784321675' 这样的好行
  • 我没有意识到,正如@Onyambu 指出的那样,您的数据中有文字's。我认为这应该可行。
【解决方案5】:

使用dplyr

library(dplyr)
library(stringr)
df %>%
   filter(str_detect(y, '^[0-9]+$')|is.na(y))

【讨论】:

    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多