子集DataTable基于列中的数字值

时间:2014-11-03 11:28:28

标签: r subset

这是我的第一个堆栈溢出帖,所以请耐心等待......

我希望在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(),但我无法继续工作。

我觉得这应该非常简单!

谢谢!

3 个答案:

答案 0 :(得分:4)

我认为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

答案 1 :(得分: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.table here

的介绍

答案 2 :(得分:0)

这肯定不是最好的方法,但在这里:

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

这是你想要的吗?