2014-11-03 61 views
2

數字值,這是我的第一個堆棧溢出後,請多多包涵......子集的DataTable基於在列

我想子集R中的DataTable,使包括含數字僅行 - 和含行字符被排除在外。例如表

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

是日期欄被認爲是數字? – 2014-11-03 11:33:23

+0

是的 - 我可以很容易地轉換日期。但是我想我首先需要清除所有字符輸入,因爲這些不應該在那裏! – wooll3y 2014-11-03 11:36:50

+1

如果'dt'是你的'data.table',你可以試一下dt [!(grepl(「[a-zA-Z]」,Date)| grepl(「[a-zA-Z]」) ),]'。 – nicola 2014-11-03 11:37:20

回答

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 
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

+0

你在這裏假設列是字符類型的,對吧?另外,我不確定我是否已經引用了'data.table' – 2014-11-03 12:01:02

+0

@DavidArenburg感謝您的評論。是的,假設char類型,我已經添加了對'data.table'的引用。 – 2014-11-03 12:12:31

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 

這是你想要的嗎?