2015-03-30 82 views
0

我蘸我的腳趾到R,我期待做一些看起來相當簡單,但我對如何着手有點失落。我讀一個CSV,看起來是這樣的:添加列分鐘,平均和最大的數據幀

translation,category,macrocategory,subcategory,1640,1641,1642,1643,1644 
almonds,nuts,Flavoring/Other,,,491,,, 
apples,Fruit,Fruits and Vegetables,42,,67,,, 
Atlantic herring,Fish,Meat,,52,0,9,, 
aurochs,Meat,Meat,game,,4,25,5, 
bacon,Meat,Meat,pork,,275.87,78,92,0 
barley groats,Grain,Grain,5,9,2,14,56,9 
beef,Meat,Meat,Beef,,5.25,,, 

我想吃點什麼是添加新列的最大,最小和平均每個食品(所以,最大,分,和平均對於每個)。我已經處理了一些基本的清理工作,但是如何從那裏繼續工作,我有點失落。

library(dplyr) 
library(tidyr) 

df <- read.csv("foods.csv", sep=",", header = T) 
food.clean <- data.frame(foodname=df[,1], data.matrix(df[,5:53])) 
str(food.clean) # check 

food.clean <- food.clean[rowSums(is.na(food.clean)) < 48, ] 
summary(food.clean) 

我使用matrixStats包也嘗試過,但遇到了一個錯誤:

library(matrixStats) 
food.matrix <- as.matrix(food.clean) 
cbind(food.clean, mean=rowMeans(food.matrix), sd=rowSds(food.matrix), max=rowMaxs(food.matrix)) 

Error in rowMeans(food.matrix) : 'x' must be numeric 

任何指針?謝謝!

+1

它不工作的原因是因爲你也轉換前四列矩陣過這反過來又轉化一切字符類。只要做到'food.matrix < - as.matrix(DF [-C(1:4)])'然後一切都將正常工作。 – 2015-03-30 20:27:23

+1

@DavidArenburg啊,謝謝你指出了! – 2015-03-31 16:15:52

回答

1

我猜你想獲得的平均值,最小值和最大值爲每個行的所有數值變量。

如果你有大量的數值變量,可以更容易在http://www.jstatsoft.org/v59/i10/

舉例說明先整理的數據,你可以做到以下幾點。

library(dplyr) 
library(tidyr) 

df <- read.csv(text=" 
translation,category,macrocategory,subcategory,1640,1641,1642,1643,1644 
almonds,nuts,Flavoring/Other,,,491,,, 
apples,Fruit,Fruits and Vegetables,42,,67,,, 
Atlantic herring,Fish,Meat,,52,0,9,, 
aurochs,Meat,Meat,game,,4,25,5, 
bacon,Meat,Meat,pork,,275.87,78,92,0 
barley groats,Grain,Grain,5,9,2,14,56,9 
beef,Meat,Meat,Beef,,5.25,,," 
) 

info <- 
    df %>% 
    # tidy data 
    gather(variable, value, -(1:4)) %>% 
    # summarise by food item 'translation' 
    group_by(translation) %>% 
    summarise(
     mean = mean(value, na.rm=TRUE), 
     min = min(value, na.rm=TRUE), 
     max = max(value, na.rm=TRUE) 
    ) 

這會給你

 translation  mean min max 
1   almonds 491.00000 491.00 491.00 
2   apples 67.00000 67.00 67.00 
3 Atlantic herring 20.33333 0.00 52.00 
4   aurochs 11.33333 4.00 25.00 
5   bacon 111.46750 0.00 275.87 
6 barley groats 18.00000 2.00 56.00 
7    beef 5.25000 5.25 5.25  

如果您仍需要原來的數值型變量,你可以用df加入這個info

df %>% left_join(info) 

有關詳細信息,我會極力推薦的整潔數據文件讀了學習dplyrtidyr包。

+0

太棒了,謝謝!這幫了很多忙。 – 2015-03-31 03:52:49

0

這並不完全清楚您的示例數據是什麼樣子(具體來說,您的標題行中是1640,1641,1642,1643,1644),但是這應該向您展示一種使用mtcars示例數據集的方法。如果你能dput實際數據,這將是更容易幫助。具體而言,您可以使用dplyr::rowwise

library(dplyr) 
df <- tbl_df(mtcars) 

head(df) 
# Source: local data frame [6 x 11] 
# 
# mpg cyl disp hp drat wt qsec vs am gear carb 
# 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
# 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
# 3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
# 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
# 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
# 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 


df %>% 
    rowwise() %>% 
    summarise(min = min(am, gear, carb), 
      max = max(am, gear, carb), 
      mean = mean(am, gear, carb)) 

# min max mean 
# 1 1 4 1 
# 2 1 4 1 
# 3 1 4 1 
# 4 0 3 0 
# 5 0 3 0 
# 6 0 3 0 
# 7 0 4 0 
# 8 0 4 0 
# 9 0 4 0 
# 10 0 4 0 
# .. ... ... ... 
相關問題