2015-11-22 71 views
3

如果非要具有表示爲這樣的字符樣品和數字的簡單的數據幀:在數據幀上的數字的字符串執行功能

Sample  Vals 
A   1,2,3,4,5 
B   3,4,5,6,7 
C   6,7,8 

使得我們可以轉換和對字符串作爲數字操作(或者傳遞給一個函數)來獲得像平均值(或其他)的東西。

Sample  Vals   Mean 
A   1,2,3,4,5 3 
B   3,4,5,6,7 5 
C   6,7,8  7 

我遇到的挑戰是類型轉換。舉例來說,我可以通過

df$Vals<-strsplit(df$Vals, ",") 

分裂丘壑出來,但其轉換爲數字或整數變得有些複雜,甚至試圖用「as.numeric」等似乎是一個非常簡單明瞭的事情,但我嘗試找到一個合適的答案無濟於事。

回答

3

隨着base R我們可以strsplit用逗號分割列,然後找到mean。確保在數據讀取時設置stringsAsFactors=FALSE

df$Mean <- sapply(strsplit(df$Vals, ","), function(x) mean(as.numeric(x))) 
df 
# Sample  Vals Mean 
#1  A 1,2,3,4,5 3 
#2  B 3,4,5,6,7 5 
#3  C  6,7,8 7 
+1

確定結合tstrsplitrowMeans從而避免的,是的,這是有幫助的。我沒有將我的stringsAsFactors設置爲FALSE – user2900006

+0

不客氣,很高興幫助 –

2

我們可以使用data.table。按'Sample'分組,我們將'Vals'拆分爲,,轉換爲'numeric'得到mean,並將其分配爲(':=)'爲'Mean'列。

library(data.table) 
setDT(df1)[,Mean := mean(as.numeric(strsplit(Vals, ',')[[1]])) , by = Sample] 
df1 
# Sample  Vals Mean 
#1:  A 1,2,3,4,5 3 
#2:  B 3,4,5,6,7 5 
#3:  C  6,7,8 7 

或者用cSplit,我們通過,分拆 '丘壑',獲得 '丘壑',通過 '樣本' 分組的mean

library(splitstackshape) 
cSplit(df1, 'Vals', ',', 'long')[, list(Vals=toString(Vals), 
         Mean=mean(Vals)) , by = Sample] 
2

使用data.table另一種選擇是按行operaiotns

library(data.table) #V1.9.6+ 
setDT(df)[, Mean := rowMeans(setDT(tstrsplit(Vals, ",", type.convert = TRUE)), na.rm = TRUE)] 
# Sample  Vals Mean 
# 1:  A 1,2,3,4,5 3 
# 2:  B 3,4,5,6,7 5 
# 3:  C  6,7,8 7 
相關問題