编写一个 R 脚本来计算数据框中的平均值

Posted

技术标签:

【中文标题】编写一个 R 脚本来计算数据框中的平均值【英文标题】:write an R sript to calulate mean in a data frame 【发布时间】:2018-09-22 18:43:57 【问题描述】:

我有一组 csv 格式的数据文件;其中大约 60 个。每个文件都有来自一个测试对象的数据。这些文件包含数据框,行是 100 个不同的分类变量,但它们是数字的,我想获得每个变量的计数。这些列是 3 个不同的连续变量,我想计算 / 类别的平均值。

我想创建一个 R 脚本,稍后我可以用一个 shell 脚本循环,以获取所有 60 个文件中这些变量的方法,并将该数据保存在一个数据框文件中,该文件将在行中包含主题 ID并且这些列将具有每个类别的 3 个不同连续变量的平均值。

有人可以帮我解决这个问题吗?谢谢

     ID  X. Label CallCounts CallDuration MeanDuration Peak.freq..mean. Peak.ampl..mean.
1   1F1  NA    NA        100       12.221      0.12221            41670         -71.1401
2         1     5         NA           NA      0.09500            46800         -73.3100
3         2     4         NA           NA      0.12900            41300         -75.2500
4         3     4         NA           NA      0.14400            41500         -72.4800
5         4     4         NA           NA      0.11000            40300         -75.2500
6         5     3         NA           NA      0.03600            41500         -83.7700
7         6     2         NA           NA      0.04900            40600         -81.2700
8         7     5         NA           NA      0.02100            49800         -64.6800
9         8     7         NA           NA      0.18700            42900         -61.0500
10        9    19         NA           NA      0.18700            41600         -67.7300
11       10     0         NA           NA      0.15900            40500         -64.3700
12       11     0         NA           NA      0.15000            40600         -70.3900
13       12     3         NA           NA      0.04300            40200         -81.2700
14       13     8         NA           NA      0.11900            41500         -75.2500
15       14     2         NA           NA      0.11300            39700         -83.7700
16       15     5         NA           NA      0.03600            41600         -75.2500
17       16     0         NA           NA      0.07600            41000         -69.7900
18       17    12         NA           NA      0.13200            46500         -62.4300
19       18     7         NA           NA      0.13500            42100         -58.9900
20       19     6         NA           NA      0.05800            43100         -59.1600
21       20     9         NA           NA      0.01500            43400         -81.2700
22       21     2         NA           NA      0.07300            41900         -68.2000
23       22     2         NA           NA      0.06700            43200         -87.2900
24       23     5         NA           NA      0.16500            42400         -68.2000
25       24     8         NA           NA      0.14100            41300         -70.3900
26       25     0         NA           NA      0.13200            40600         -72.4800
27       26     6         NA           NA      0.07300            39000         -81.2700
28       27     3         NA           NA      0.16200            40500         -74.2200
29       28    14         NA           NA      0.17800            39800         -79.3300
30       29     0         NA           NA      0.11300            38400         -76.4100
31       30     7         NA           NA      0.12500            40200         -71.7300
32       31     6         NA           NA      0.09800            39500         -72.4800
33       32    19         NA           NA      0.07300            48900         -55.2500
34       33     6         NA           NA      0.13200            42800         -74.2200
35       34    10         NA           NA      0.14700            43200         -67.7300
36       35     2         NA           NA      0.08900            38500         -77.7500
37       36     5         NA           NA      0.03300            43900         -73.3100
38       37    19         NA           NA      0.09200            46500         -73.3100
39       38     7         NA           NA      0.16800            41100         -71.0300
40       39     6         NA           NA      0.15900            42400         -71.7300
41       40     5         NA           NA      0.19900            40800         -72.4800
42       41     5         NA           NA      0.21500            41600         -68.7000
43       42     5         NA           NA      0.15000            41800         -63.2100
44       43     5         NA           NA      0.12900            38700         -72.4800
45       44     0         NA           NA      0.10100            38000         -74.2200
46       45     8         NA           NA      0.15000            46000         -62.9400
47       46    10         NA           NA      0.12900            41600         -64.3700
48       47     0         NA           NA      0.18400            41500         -62.9400
49       48     5         NA           NA      0.15600            40600         -71.7300
50       49     2         NA           NA      0.03900            38400         -81.2700
51       50     5         NA           NA      0.13800            39800         -71.0300
52       51    14         NA           NA      0.15600            41600         -61.4900
53       52     8         NA           NA      0.13500            39700         -73.3100
54       53     3         NA           NA      0.11300            39300         -73.3100
55       54     6         NA           NA      0.16200            40800         -70.3900
56       55     5         NA           NA      0.07900            38500         -72.4800
57       56    12         NA           NA      0.12900            46000         -59.8700
58       57     4         NA           NA      0.14400            39700         -77.7500
59       58     2         NA           NA      0.03900            43700         -69.2300
60       59     6         NA           NA      0.10700            42100         -74.2200
61       60     0         NA           NA      0.15600            41100         -59.8700
62       61     5         NA           NA      0.19000            41800         -60.2400
63       62     8         NA           NA      0.15600            40300         -71.0300
64       63     7         NA           NA      0.16800            38500         -81.2700
65       64    13         NA           NA      0.15000            39300         -74.2200
66       65     2         NA           NA      0.10100            40200         -81.2700
67       66     7         NA           NA      0.14100            40000         -70.3900
68       67     7         NA           NA      0.11900            42300         -58.1900
69       68     6         NA           NA      0.17800            40300         -74.2200
70       69     3         NA           NA      0.05200            43600         -75.2500
71       70     7         NA           NA      0.11900            46000         -65.7000
72       71     7         NA           NA      0.15900            42400         -66.8600
73       72     7         NA           NA      0.14100            41300         -66.0700
74       73     4         NA           NA      0.20500            40600         -77.7500
75       74     4         NA           NA      0.14700            40200         -77.7500
76       75     5         NA           NA      0.07300            38700         -81.2700
77       76     5         NA           NA      0.14700            41600         -70.3900
78       77     6         NA           NA      0.15600            39200         -79.3300
79       78     5         NA           NA      0.06400            42400         -72.4800
80       79    14         NA           NA      0.13200            42300         -65.3500
81       80     7         NA           NA      0.15000            42300         -65.7000
82       81     5         NA           NA      0.00900            41100         -72.4800
83       82     7         NA           NA      0.16800            40800         -66.8600
84       83     5         NA           NA      0.13500            39000         -72.4800
85       84    12         NA           NA      0.18700            42600         -72.4800
86       85     5         NA           NA      0.11600            40500         -71.7300
87       86    18         NA           NA      0.08600            41500         -70.3900
88       87    14         NA           NA      0.10400            43600         -71.0300
89       88     3         NA           NA      0.18100            41800         -69.7900
90       89     3         NA           NA      0.14700            41000         -67.7300
91       90     0         NA           NA      0.09800            40500         -71.0300
92       91     6         NA           NA      0.16200            41300         -67.2900
93       92     2         NA           NA      0.08200            38800         -87.2900
94       93    10         NA           NA      0.09200            48600         -60.8400
95       94    10         NA           NA      0.04600            48600         -69.2300
96       95    11         NA           NA      0.05200            47500         -72.4800
97       96     8         NA           NA      0.17500            41600         -69.2300
98       97     7         NA           NA      0.15900            42100         -61.9400
99       98     5         NA           NA      0.14700            39800         -68.7000
100      99     8         NA           NA      0.15900            40300         -68.2000
101     100     7         NA           NA      0.14400            40800         -67.7300
    Fundamental..mean. Bandw..mean.
1                30644        29112
2                 4200         5000
3                 2400        82800
4                41500         2400
5                 2500        82800
6                41500        82800
7                40600        82800
8                 4500         6800
9                42900         2200
10               41600         2100
11               40500         1100
12               40600         1400
13               40200        82800
14               41500        82800
15               39700        82800
16               41600        82800
17               41000         1400
18                3800         5500
19               42100         1600
20               43100         1300
21                1600        82800
22               41900         1600
23                   0        82800
24               42400         2400
25               41300         1700
26               40600         1100
27               39000        82800
28                1100        82800
29               39800        82800
30               38400        82800
31                1200         2600
32               39500         1700
33               48900         3700
34               42800        82800
35                2800         5300
36               38500        82800
37               43900         1900
38                2900         4200
39               41100         1900
40               42400         2700
41               40800         2400
42               41600         2600
43               41800         2700
44               38700         1700
45               38000        82800
46                3200         4800
47               41600         2400
48               41500         1400
49               40600         2200
50               38400        82800
51               39800         1900
52               41600         2100
53               39700        40600
54                1400         2100
55               40800         2200
56               38500        39800
57                2800         4300
58               39700        82800
59               43700         2400
60               42100        82800
61               41100         1100
62               41800         1600
63               40300         1700
64               38500        82800
65               39300        82800
66               40200        82800
67               40000         1900
68                3800         4300
69                1900        82800
70               43600        82800
71                2000         4000
72               42400         4200
73                1900         2700
74               40600        82800
75                1600        82800
76               38700        82800
77               41600         5600
78               39200        82800
79               42400         3500
80               42300         2100
81               42300         1700
82               41100        41500
83                1600         2600
84               39000        40300
85                   0         6500
86               40500         1300
87               41500         1300
88               43600         2100
89               41800         2600
90                1400         3500
91               40500          900
92               41300         1900
93               38800        82800
94               48600         1900
95                6000         7300
96                5900         6900
97               41600        42100
98                1400         6300
99               39800         2100
100                900        41900
101               1400         2600

所以标签列是分类变量,我想计算每个不同标签的 MeanDuration、Peak.Freq 和 Peak.ampl 的平均值。我想通过创建一个带有主题 ID 的最终表来对所有 60 个文件进行相同的操作,该主题 ID 是行和列中每个文件的名称,每个标签(类别)将具有每个提到的变量的平均值。

【问题讨论】:

您有任何样本数据可以提供给我们吗?它将帮助用户制定答案。 【参考方案1】:

老实说,我认为你不需要一个 forloop。我根据您提供的数据做出了相当多的假设,但这应该会给您一个公平的开始,使用library(tidyverse)

library(tidyverse)
# Get list of all files
files = list.files(path = "/path_of_directory_containing_all_csv_files", #TODO Change
                   pattern = "*.csv")

file_df <- data_frame(files)

# Change working directory to csv location
checkpoint_wd <- getwd()
setwd("/path_of_directory_containing_all_csv_files/") #TODO Change

# Read in each file and aggregrate to a single dataframe
raw_df <- do.call(rbind, lapply(file_df$files, function(x)
  read_csv(x, na = c("", "NA")) %>% # Specify the NAs here
    select(1:10) %>% # This will keep the same number of columns
    mutate(Source = x) %>%  # This will keep track of which data comes from which file
    fill(ID) # This will fill in the NAs in the ID column
))

# Reset working directory
setwd(checkpoint_wd)

# Now calculate means
df <- raw_df %>% 
  group_by(ID, Source, Label) %>% 
  mutate(MeanDuration = mean(MeanDuration, na.rm = TRUE),
         Peak.freq = mean(Peak.freq, na.rm = TRUE), #TODO Change
         Peak.ampl = mean(Peak.ampl, na.rm = TRUE)) #TODO Change

您需要更改我用#TODO Change 指示的代码。对于最终的mutate,数据中的列名与您声明的列名之间可能存在一些差异。因此,您可能还需要更改这些内容。

【讨论】:

嗨,戴夫,非常感谢您的帮助,非常感谢我尝试运行第一个函数并收到此消息 使用列规范解析:cols( ID = col_character(), # = col_integer(), Label = col_integer(), CallCounts = col_integer(), CallDuration = col_double(), MeanDuration = col_double (), Peak freq (mean) = col_integer(), Peak ampl (mean) = col_double(), Fundamental (mean) = col_integer(), Bandw (mean) = col_integer() ) rbind(deparse.level, ...) 中的错误:参数列不匹配另外:警告消息:缺少列名填写:'X11'[11] 已更新以解决该问题。我想值得一提的是,所有感兴趣的 .csv 文件都应该在它们自己的目录中!如果这个指定目录下还有其他不相关的.csv文件,上面的代码就不起作用了。

以上是关于编写一个 R 脚本来计算数据框中的平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何从R中的数据框中删除负值

通过数据框中的一个参数计算具有平均值的新行[重复]

Pandas:交换一个数据框中的特定列值并计算其加权平均值

如何利用字典计算数据框中的多个平均值

给定列名,数据框中列的平均值

Python数据框中的置信区间