这是我的第一个堆栈溢出帖,所以请耐心等待......
我希望在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()
,但我无法继续工作。
我觉得这应该非常简单!
谢谢!
答案 0 :(得分:4)
我认为data.table
使用.SD
和lapply
的更通用和有效的用法(如果您想要转换的不仅仅是两列而且您不想想手动指定它们
无论
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
这是你想要的吗?