Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何有效地分析excel中的数据?_R_Excel_Analysis - Fatal编程技术网

R 如何有效地分析excel中的数据?

R 如何有效地分析excel中的数据?,r,excel,analysis,R,Excel,Analysis,我在excel中有一个数据,列代表一些类别,每行代表单个用户关于类别的数据。 而且它们没有以任何方式进行分类。以下是数据样本 user food date ........ a pizza 1/1/2013 b fries 1/3/2013 c sandwich 5/2/2013 a sandwich 2/3/2010 我想找出每个使用者吃什么食物的概率。 所以我想要像这样的输出 a pizza 20%

我在excel中有一个数据,列代表一些类别,每行代表单个用户关于类别的数据。 而且它们没有以任何方式进行分类。以下是数据样本

user  food      date      ........
a     pizza     1/1/2013
b     fries     1/3/2013
c     sandwich  5/2/2013
a     sandwich  2/3/2010
我想找出每个使用者吃什么食物的概率。 所以我想要像这样的输出

a  pizza     20%
   sandwich  50%
   fries     30%

b  pizza     10%
   noodle    20%
最有效的方法是什么?
我在excel中按用户筛选,使用R查找每种食物的频率,并在excel表格中键入所有频率

如果你已经知道一些R,我建议你咬紧牙关,在R中完成这类工作。Excel是一个有用的工具,但对于严肃的数据分析来说,R要好得多,而且是一项值得投资的工具

这就是我在R中的做法:

# Create some sample data
foods = c('pizza', 'sandwich', 'tuna', 'noodles', 'fries')
persons = letters[1:10] # letters is a variable containing all the letters of the alphabet, standarly available in R
df = data.frame(food = sample(foods, 1000, replace = TRUE),
                person = sample(persons, 1000, replace = TRUE))

# Get frequencies
table_df = table(df)
# Divide by total food eaten by each person
# In both `apply` and `sweep`, the `2` refers to performing the operation per column
prob_df = apply(table_df, 2, 
             function(food_per_person) {
                  (food_per_person / sum(food_per_person)) * 100
             })
# An alternative to using `apply` is to use `sweep`:
prob_df = sweep(table_df, 2, margin.table(table_df, 2), FUN = "/")
prob_df
# All close to 20%, as expected
        person
                  a        b        c        d        e        f        g
  fries    21.34831 22.88136 17.17172 19.04762 19.81132 18.34862 16.03774
  noodles  19.10112 19.49153 19.19192 23.80952 18.86792 22.01835 19.81132
  pizza    13.48315 18.64407 16.16162 19.04762 16.03774 13.76147 23.58491
  sandwich 24.71910 21.18644 22.22222 13.09524 23.58491 30.27523 18.86792
  tuna     21.34831 17.79661 25.25253 25.00000 21.69811 15.59633 21.69811
          person
                  h        i        j
  fries    23.14815 18.75000 11.76471
  noodles  17.59259 26.04167 24.70588
  pizza    19.44444 19.79167 18.82353
  sandwich 23.14815 14.58333 24.70588
  tuna     16.66667 20.83333 20.00000
并检查结果,即人均百分比是否增加到100%:

colSums(prob_df)
  a   b   c   d   e   f   g   h   i   j 
100 100 100 100 100 100 100 100 100 100 

使用pivot表,我可以找到一个用户吃过的食物类型的数量,但是我很难找到每个用户吃过的食物的次数。如果你想要更复杂的东西,我只需要使用一个更合适的工具(R)。请参阅我的答案,了解完整的工作示例。您可能不喜欢这个答案,但:永远不要使用Excel进行数据分析。除了不可追踪的公式依赖项和内置Excel函数有错误之外,使用电子表格工具进行计算是不明智的。谢谢你的评论。我可以用R一点,但我还是R的新手。所以我不明白你们是如何使用食物的?你能更具体地解释一下那部分吗?再次感谢您使用
apply
MARGIN=2
将函数应用于
表中的每一列。这可以是内置函数(例如,
sum
t.test
),也可以是用户定义的函数。在上面的
apply
调用中,我动态定义了一个函数。该函数接受一个输入参数,
food\u person
,在本例中,该参数是其中一列的值。在函数中,我将每列除以列的总和乘以100,即列中各个值出现的时间百分比。