2017-07-21 23 views
2

我有一個包含一個名字列和值列的數據幀:R數據框 - 大多在數值列轉換字爲零

a <- c("Bob","Jane","Susan","Greg") 
b <- c(10, "Jane", 14, "Greg") 
df = data.frame(a,b) 
df 
     a b 
1 Bob 10 
2 Jane Jane 
3 Susan 14 
4 Greg Greg 

我想的話轉換列B爲零像這樣:

a b 
1 Bob 10 
2 Jane 0 
3 Susan 14 
4 Greg 0 

在此先感謝!

+1

嘗試'DF $ B = as.numeric(GSUB( 「[^ 0-9]」, 「0」,DF $ b))的'' – juan

+0

ifelse(grepl(\\ d',DF $ b),0,df $ b)',也可以,但只有當'df $ b'不作爲因子存儲時纔有效。 – Damian

回答

3

我會強迫bnumeric,並將其留在那。由於b最初是factor,我首先將它強制爲character

df$b = as.numeric(as.character(df$b)) 
#Warning message: 
#NAs introduced by coercion 
df$b 
#[1] 10 NA 14 NA 

在一個步驟,如果你願意,你可以用0取代NA(但是我只想保持NA

df$b[is.na(df$b)] = 0 
df$b 
#[1] 10 0 14 0 

當然,你可以使用gsub替代非數字字符(\\D+)與"0"。請注意0​​自動強制爲character

gsub(pattern = "\\D+", replacement = "0", x = df$b) 
#[1] "10" "0" "14" "0" 
0

我不是R專家,但我相信,根據上面的評論,df$b = as.numeric(gsub("[^0-9]", "0", df$b))會工作得很好。

更具體地說,你的代碼更改爲:

a <- c("Bob","Jane","Susan","Greg") 
b <- c(10, "Jane", 14, "Greg") 
df = data.frame(a,b) 
df$b = as.numeric(gsub("[^0-9]", "0", df$b)) 
df 

這是你有相同的代碼,但隨着新線操縱使用as.numeric轉換爲數字和GSUB的向量b,它允許你迭代一個向量並將正則表達式應用於每個值(more information)。

gsub的第一個參數是正則表達式 - 在這種情況下,我們使用的是[^0-9],它將匹配任何非數值的值(請記住,如果數字中可能有特殊字符,則可能需要更改此值) 。正則表達式可以方便地在這裏測試:regex101

第二個參數是如果正則表達式不通過,用什麼替換當前值。

第三個參數是要遍歷的向量。

然後將新的矢量傳遞給as.numeric方法。

下面的代碼片段可以在R-小提琴可以看出,here

再次,我不是的R程序員,但我覺得這回答了你的問題。