计算并向R中的数据框添加新变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算并向R中的数据框添加新变量相关的知识,希望对你有一定的参考价值。
参考技术A 本教程描述了R中如何计算和添加新的变量到一个数据框.你将学习dplyr R包以下R函数:mutate (): 计算并向数据表中添加新变量。它保留了现有的变量。
transmute (): 计算新列,但删除现有变量。
我们还将提供mutate()和transmute()的三种变体,以便同时修改多个列:
mutate_all () / transmute_all (): 对数据框中的每一列应用一个函数
mutate_at () / transmute_at (): 将函数应用于用字符向量选定的特定列
mutate_if () / transmute_if (): 将一个函数应用于返回TRUE的函数所选择的列。
mutate: 通过保留现有变量来添加新变量
添加新列 (sepal_by_petal_*):
transmute: 通过删除现有变量来创建新变量
添加新列 (sepal_by_petal_*),并删除现有列:
一次修改多个列
我们首先创建一个演示数据集my_data2,它只包含数字列。为此,我们将删除列物种
函数 mutate_all() / transmute_all(), mutate_at() / transmute_at() 和mutate_if() / transmute_if() 可用于一次修改多个列。
函数简要形式如下所示:
# Mutate variants
mutate_all(.tbl, .funs,...)
mutate_if(.tbl, .predicate, .funs,...)
mutate_at(.tbl, .vars, .funs,...)
# Transmute variants
transmute_all(.tbl, .funs,...)
transmute_if(.tbl, .predicate, .funs,...)
transmute_at(.tbl, .vars, .funs,...)
.tbl: tbl 数据框
.funs: List of function calls generated by funs(), or a character vector of function names, or simply a function.由funs()、函数名的字符向量或简单的函数生成的函数调用列表。
…: funs中函数调用的附加参数。
.predicate: A predicate function to be applied to the columns or a logical vector. The variables for which .predicate is or returns TRUE are selected.
转换所有列
注意,点“.” 表示所有任意变量。
如果.funs有多个名称或多个输入,函数名将被附加到列名中:
注意,输出变量名现在包含了函数名。
转换特定的列
mutate_at (): 转换按名称选择的特定列:
mutate_if (): transform specific columns selected by a predicate function.
mutate_if() 在将变量从一种类型转换为另一种类型时特别有用。
所有数值变量四舍五入:
Summary
本文描述了如何使用dplyr函数向数据框架中添加新的变量列:mutate()、transmute()
mutate(iris, sepal = 2*Sepal.Length): Computes and appends new variable(s).
transmute(iris, sepal = 2*Sepal.Length): Makes new variable(s) and drops existing ones.
编写一个 R 脚本来计算数据框中的平均值
【中文标题】编写一个 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中的数据框添加新变量的主要内容,如果未能解决你的问题,请参考以下文章