2015-03-30 34 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 
# .. ... ... ... 
相关问题