【问题标题】:Subset DataTable based on Numeric Values in Columns基于列中的数值的子集数据表
【发布时间】:2014-11-03 11:28:27
【问题描述】:

这是我的第一个堆栈溢出帖子,所以请多多包涵……

我希望在 R 中对数据表进行子集化,以便仅包含包含数字的行 - 并排除包含字符的行。例如表格

 Date   Temperature
    41941.6656  1921
    41941.6656  1921
    41941.66561 1921
    41941.66563 1921
    41941.66564 1921
    41941.pypito    1921
    41941.66566 xWRET
    41941.66567 1921

应该变成

Date    Temperature
41941.6656  1921
41941.6656  1921
41941.66561 1921
41941.66563 1921
41941.66564 1921
41941.66567 1921

其中 xWRET 表示我的愚蠢仪器经常使用的一些随机字符串

我已经尝试过is.numeric()grep(),但是我都无法工作。

我觉得这应该很简单!

谢谢!

【问题讨论】:

  • 日期列是否被视为数字?
  • 是的 - 我可以很容易地转换日期。但是我认为我首先需要清除所有字符条目,因为这些不应该存在!
  • 如果dt是你的data.table,你可以试试dt[!(grepl("[a-zA-Z]",Date) | grepl("[a-zA-Z]",Temperature)),]
  • 或者,您可以dt[]<-na.omit(lapply(dt,as.numeric)) 将所有内容都转换为数字。
  • 感谢 nicola - 效果很好! :)

标签: r subset


【解决方案1】:

我认为data.table 的更通用和更有效的用法是使用.SDlapply(如果您想要转换的不仅仅是两列并且不想手动指定它们)

要么

library(data.table)
na.omit(setDT(df)[, lapply(.SD, function(x) as.numeric(as.character(x)))])
#        Date Temperature
# 1: 41941.67        1921
# 2: 41941.67        1921
# 3: 41941.67        1921
# 4: 41941.67        1921
# 5: 41941.67        1921
# 6: 41941.67        1921

或者

setDT(df)[, names(df) := lapply(.SD, function(x) as.numeric(as.character(x)))][complete.cases(df)]
#        Date Temperature
# 1: 41941.67        1921
# 2: 41941.67        1921
# 3: 41941.67        1921
# 4: 41941.67        1921
# 5: 41941.67        1921
# 6: 41941.67        1921

【讨论】:

    【解决方案2】:

    如果您还不熟悉data.table 及其成语的相对复杂性,您也可以使用基函数。

    假设您将 data.frame 列作为字符。

    df$Date <- as.numeric(df$Date)
    df$Temperature <- as.numeric(df$Temperature)
    

    df1 <- sapply(df, as.numeric)
    

    最后

    df[complete.cases(df), ]
    df1[complete.cases(df1), ]
    

    得到

             Date Temperature
    [1,] 41941.67        1921
    [2,] 41941.67        1921
    [3,] 41941.67        1921
    [4,] 41941.67        1921
    [5,] 41941.67        1921
    [6,] 41941.67        1921
    

    更多关于data.tablehere的介绍

    【讨论】:

    • 您在这里假设列是字符类型,对吗?另外,我不确定您是否提到了data.table
    • @DavidArenburg 感谢您的评论。是的,假设 char 类型并且我添加了对 data.table 的引用。
    【解决方案3】:

    这肯定不是最好的方法,但就是这样:

    library(data.table) # use this package, it is great for perfomance
    lines="
    41941.6656 1921
    41941.6656 1921
    41941.66561 1921
    41941.66563 1921
    41941.66564 1921
    41941.pypito 1921
    41941.66566 xWRET
    41941.66567 1921"
    con <- textConnection(lines)
    d = data.table(read.table(con,stringsAsFactors = FALSE,
               sep=" ", 
               col.names=c("Date", "Temperature"), 
               fill=FALSE, 
               strip.white=TRUE))
    close(con)
    d<-d[!is.na(as.numeric(Temperature)) & !is.na(as.numeric(substr(Date,start=7,stop=7)))]
    

    这对我来说,返回以下内容:

              Date Temperature
    1:  41941.6656        1921
    2:  41941.6656        1921
    3: 41941.66561        1921
    4: 41941.66563        1921
    5: 41941.66564        1921
    6: 41941.66567        1921
    

    这是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2015-08-09
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多