我是“R”的完全初学者,目前正在通过互联网上的教程和视频进行学习。目前,我仍在使用 Excel(或 Libreoffice)完成所有统计任务......但从长远来看,这对我来说太愚蠢了 - 仅出于许可原因 - 特别是因为我已经成为 Linux 用户数十年了。
我的问题:
我从数据库创建一个 csv 文件,其中包含计算出的查询平均值。该文件是针对日历年绘制的,因此某些行中包含完全零的值。 (活动尚未举行)。
数据集:(“Beispiel.csv”)
Merkmal;Kriterium 1;Kriterium 2;Kriterium 3;Kriterium 4;Gesamt
251;0;0;0;0;0
251;0;0;0;0;0
320;0;0;0;0;0
254;0;0;0;0;0
608;0;0;0;0;0
600;0;0;0;0;0
602;0;0;0;0;0
253;0;0;0;0;0
253;0;0;0;0;0
609;0;0;0;0;0
265;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
320;0;0;0;0;0
997;0;0;0;0;0
996;0;0;0;0;0
601;0;0;0;0;0
604;0;0;0;0;0
222;0;0;0;0;0
996;0;0;0;0;0
604;0;0;0;0;0
289;0;0;0;0;0
278;0;0;0;0;0
308;0;0;0;0;0
266;0;0;0;0;0
299;0;0;0;0;0
602;0;0;0;0;0
996;0;0;0;0;0
805;0;0;0;0;0
320;0;0;0;0;0
224;0;0;0;0;0
427;0;0;0;0;0
309;0;0;0;0;0
997;0;0;0;0;0
997;0;0;0;0;0
275;0;0;0;0;0
600;0;0;0;0;0
607;0;0;0;0;0
996;0;0;0;0;0
309;0;0;0;0;0
997;0;0;0;0;0
320;0;0;0;0;0
430;0;0;0;0;0
320;0;0;0;0;0
997;0;0;0;0;0
608;0;0;0;0;0
321;0;0;0;0;0
317;0;0;0;0;0
163;0;0;0;0;0
996;0;0;0;0;0
320;0;0;0;0;0
320;0;0;0;0;0
600;0;0;0;0;0
996;0;0;0;0;0
805;0;0;0;0;0
996;0;0;0;0;0
230;0;0;0;0;0
290;0;0;0;0;0
606;0;0;0;0;0
601;0;0;0;0;0
299;0;0;0;0;0
276;0;0;0;0;0
310;0;0;0;0;0
320;0;0;0;0;0
302;0;0;0;0;0
604;0;0;0;0;0
320;0;0;0;0;0
222;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
608;0;0;0;0;0
275;0;0;0;0;0
289;0;0;0;0;0
433;0;0;0;0;0
180;0;0;0;0;0
180;0;0;0;0;0
250;0;0;0;0;0
602;0;0;0;0;0
996;0;0;0;0;0
603;0;0;0;0;0
996;0;0;0;0;0
435;1,69;1,62;2;1,33;1,77
997;0;0;0;0;0
997;0;0;0;0;0
996;0;0;0;0;0
268;1,8;1,67;2;1,2;1,82
609;1,38;1,13;1,38;1,25;1,3
310;1,53;1,53;1,59;1,35;1,55
996;0;0;0;0;0
997;0;0;0;0;0
321;1,27;1,53;1,27;1;1,36
601;1,88;1,63;1,63;1,25;1,71
320;1,19;1,06;1,31;1,13;1,19
996;0;0;0;0;0
157;1,5;1,75;1,69;1,53;1,65
996;0;0;0;0;0
229;1,25;1,25;1,25;1,31;1,25
322;1,45;1,27;1,27;1,09;1,33
996;0;0;0;0;0
997;0;0;0;0;0
257;0;0;0;0;0
600;1,73;1,8;1,4;1,53;1,64
604;1,12;1,12;1,47;1,12;1,24
996;0;0;0;0;0
256;0;0;0;0;0
320;1,44;1,28;1,61;1,39;1,44
997;0;0;0;0;0
320;1,38;1,38;1,63;1,36;1,46
601;1,59;1,59;1,82;1,35;1,67
997;0;0;0;0;0
996;0;0;0;0;0
603;2,2;1,8;2,4;1,4;2,13
225;1,47;1,67;1,8;1,27;1,65
231;2;2;1,77;1,54;1,92
996;0;0;0;0;0
996;0;0;0;0;0
299;1,6;1,73;1,87;1,87;1,73
602;1,25;1,08;1,17;1,33;1,17
604;2,24;1,82;2,12;1,12;2,06
996;0;0;0;0;0
606;1,14;1,07;1,21;1;1,14
126;1,5;1,38;1,5;1,25;1,46
319;1,33;2,11;1,67;1,11;1,7
605;1,78;1,67;1,89;1,11;1,78
320;1,44;1,5;1,81;1,5;1,58
265;1,47;1,59;1,53;1,47;1,53
997;0;0;0;0;0
600;1,47;1,41;1,81;1,24;1,56
158;2,27;2,07;2,29;1,33;2,21
320;1,53;1,12;1,82;1,18;1,49
320;1,08;1;1,23;1,23;1,1
996;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
276;1,06;1,06;1,35;1,35;1,16
996;0;0;0;0;0
607;2,31;1,92;2,31;1,46;2,18
317;2,31;2,63;2,81;1,63;2,58
224;1,94;1,88;1,5;1,5;1,77
996;0;0;0;0;0
608;4,27;2,73;4,18;1,42;3,73
996;0;0;0;0;0
289;1,6;1,4;1,67;1,47;1,56
996;0;0;0;0;0
996;0;0;0;0;0
259;0;0;0;0;0
433;1,31;1,19;1,5;1,25;1,33
163;1,53;1,8;1,73;1,07;1,69
600;1,72;1,67;1,61;1,39;1,67
997;0;0;0;0;0
997;0;0;0;0;0
996;0;0;0;0;0
997;0;0;0;0;0
222;1,65;1,82;1,88;1,19;1,78
996;0;0;0;0;0
996;0;0;0;0;0
609;1,27;1,2;1,53;1,07;1,33
320;1,39;1,11;1,39;1,33;1,3
223;1,73;1,27;1,64;1;1,55
308;2,33;2,83;2,17;1,39;2,44
996;0;0;0;0;0
266;2,09;1,64;1,64;1,18;1,79
997;0;0;0;0;0
322;1,13;1,13;1,19;1;1,15
603;2,07;1,8;2,27;1,47;2,05
601;1,53;1,24;1,35;1,18;1,37
996;0;0;0;0;0
602;2,29;2,47;2,35;1,69;2,37
321;1,06;1,19;1,13;1;1,13
996;0;0;0;0;0
603;3,33;2,73;3,47;2,07;3,18
606;1,2;1,2;1,2;1;1,2
321;1,06;1;1,25;1;1,1
320;1,41;1,35;1,65;1,41;1,47
289;1,54;1,46;1,38;1,69;1,46
997;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
275;1,85;1,85;1,69;1,31;1,8
608;2,86;2;2,79;1,79;2,55
996;0;0;0;0;0
996;0;0;0;0;0
320;1,17;1,06;1,5;1,61;1,24
320;1,36;1,21;1,57;1,21;1,38
320;1,35;1,41;1,41;1,06;1,39
322;1,35;1,12;1,47;1;1,31
436;2,57;2,14;2,5;2,29;2,4
997;0;0;0;0;0
609;1,58;1,5;2,17;1,58;1,75
414;1,39;1,44;1,5;1,61;1,44
996;0;0;0;0;0
996;0;0;0;0;0
997;0;0;0;0;0
997;0;0;0;0;0
997;0;0;0;0;0
601;1,33;1,33;1,47;1,27;1,38
428;1,33;1,17;1,83;1;1,44
997;1,38;1,5;1,5;2,13;1,46
320;1,06;1,06;1,17;1,06;1,1
997;0;0;0;0;0
308;1,36;1,73;1,55;1;1,55
320;1,22;1,11;1,11;1,25;1,15
997;0;0;0;0;0
605;1,53;1,33;1,47;1,33;1,44
253;0;0;0;0;0
996;0;0;0;0;0
600;1,33;1,17;1,39;1,39;1,3
607;1,44;1,5;1,69;1,31;1,54
996;0;0;0;0;0
263;0;0;0;0;0
997;0;0;0;0;0
299;1,53;1,47;1,41;1,47;1,47
603;2,27;2,07;1,93;1,47;2,09
320;1,41;1,47;1,41;1,06;1,43
320;1,28;1,11;1,67;1,11;1,35
219;1,72;1,72;1,94;1,44;1,79
320;1,28;1,29;1,56;1,06;1,38
997;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
996;0;0;0;0;0
435;1,82;1,24;2,07;1,25;1,71
230;1,59;1,71;1,71;1,06;1,67
163;1,56;1,56;1,44;1,38;1,52
996;0;0;0;0;0
608;4,2;2,53;3,67;1,4;3,47
320;1,44;1,56;1,56;1,39;1,52
996;0;0;0;0;0
289;1,4;1,27;1,6;1,13;1,42
609;1,18;1;1,45;1,45;1,21
996;0;0;0;0;0
602;2,31;2,81;2,63;1,2;2,58
224;1,47;1,71;1,47;1,18;1,55
996;0;0;0;0;0
996;0;0;0;0;0
600;1,38;1,5;1,38;1,38;1,42
996;0;0;0;0;0
996;0;0;0;0;0
320;1,44;1,39;1,67;1,61;1,5
310;1,39;1,56;1,39;1,22;1,45
320;1,33;1,11;1,25;1,17;1,23
320;1,47;1,29;1,41;1,41;1,39
603;2,95;1,74;3,72;1,05;2,8
997;0;0;0;0;0
996;0;0;0;0;0
302;1,38;1,31;1,38;1,15;1,36
601;1,89;1,72;1,76;1,72;1,79
996;0;0;0;0;0
605;1,47;1,73;1,93;1,07;1,71
996;0;0;0;0;0
317;1,65;2;1,93;1,35;1,86
320;1,25;1,19;1,31;1,69;1,25
433;1,38;1,23;1,31;1,08;1,31
603;3,24;2,82;2,71;1,13;2,92
996;0;0;0;0;0
997;0;0;0;0;0
996;0;0;0;0;0
229;1,5;2,36;1,93;1,36;1,93
259;0;0;0;0;0
320;1,18;1;1,12;1,06;1,1
320;1,22;1,06;1,33;1,28;1,2
251;0;0;0;0;0
997;0;0;0;0;0
320;1,35;1,29;1,44;1,12;1,36
996;0;0;0;0;0
(我已经从示例文件中删除了所有不重要的列,缩短了行数(否则有 10 倍的数量和更改......如上所述)并重命名了列(出于数据保护原因)。“特征”通常仍然有一个单独的标识符,但我已经在这里使用以下函数成功做到了这一点:
beispiel$merkmal <- substr(beispiel$merkmal, 1, 3)
...左边的三个字符。 )
根据第 1 列中的特征,我现在想根据每个特征计算每个标准的平均值。原则上,这意味着函数会删除所有标准中具有零值的所有行,因为它们在计算平均值时会扭曲该值。
然后我想确定平均值 - 例如特征“320”的 - 对于整个表中的四个标准中的每一个,并将其写入新的数据帧。
换句话说,将创建一个数据帧,其中仅在第一列中包含一次特征,并在接下来的 4 列中的每一列中包含 4 个特征的平均值。
这个数据框应该是条形图的输出……而不是 4 个条形图。
我现在想添加一个最小的例子,但我什至不知道如何开始。我不希望你们中的任何人为我写剧本,而是要推动我朝正确的方向前进。
我想尽可能在 R 中完成所有步骤,而不是先在 Libreoffice 中“准备”表格。
如何删除所有列(条件 1 - 4)中包含零值的行?
如何计算各个平均值(我的想法是使用“for 循环”)?
提前致谢
史蒂芬
(如何上传示例文件?)
如果您通过
dput()
提供一些示例数据,通常会更有帮助。例如,我在这里获取 mtcars
数据集的前 2 行:
dput(head(mtcars, 2))
然后,您的控制台将显示:
structure(list(mpg = c(21, 21), cyl = c(6, 6), disp = c(
160,
160
), hp = c(110, 110), drat = c(3.9, 3.9), wt = c(2.62, 2.875), qsec = c(16.46, 17.02), vs = c(0, 0), am = c(1, 1), gear = c(
4,
4
), carb = c(4, 4)), row.names = c("Mazda RX4", "Mazda RX4 Wag"), class = "data.frame")
现在,任何潜在的回答者都可以将其复制并粘贴到他们的 R 会话中,并获得与您正在使用的相同的数据。或者,您可以通过代码提供
data.frame
,以便其他人可以生成,这就是我在下面所做的。
# example data
df <- data.frame(
M = c(180, 268, 609, 268, 609),
K1 = c(1, 0, 1, 0, 1),
K2 = c(69, 0, 28, 0, 54),
K3 = c(1.62, 0, 1.67, 0, 1.72),
K4 = c(2, 0, 2, 0, 2),
K5 = c(1.33, 0, 1.2, 0, 1.6),
G = c(1.77, 0, 1.88, 0, 1.45)
)
我相信这看起来与您正在使用的类似。
M K1 K2 K3 K4 K5 G
<num> <num> <num> <num> <num> <num> <num>
1: 180 1 69 1.62 2 1.33 1.77
2: 268 0 0 0.00 0 0.00 0.00
3: 609 1 28 1.67 2 1.20 1.88
4: 268 0 0 0.00 0 0.00 0.00
5: 268 1 54 1.72 2 1.60 1.45
无论如何,我喜欢
data.table
包来处理这类事情。安装 data.table
软件包后,您可以将 data.frame
转换为 data.table
,然后获取这些摘要。
# cast to data.table
dt <- data.table::as.data.table(df)
# take the means of the columns, by the Merkmal column
# excluding Merkmal == 268
dt[!M %in% c(268), lapply(.SD, mean), by = M, .SDcols = c("K1", "K2", "K3", "K4", "K5", "G")]
我在这里评论了每个部分的作用:
dt[
# filter out the Merkmals you don't want
!M %in% c(268),
# this says to apply the mean() function over the columns listed in .SDcols,
lapply(.SD, mean),
# do this operation separately for each Merkmal
by = M,
# the columns to take the mean of
.SDcols = c("K1", "K2", "K3", "K4", "K5", "G")
]
您还可以按
K1
中的值进行过滤。
df[K1 != 0, lapply(.SD, mean), by = M, .SDcols = c("K1", "K2", "K3", "K4", "K5", "G")]
无论哪种情况,都会导致:
M K1 K2 K3 K4 K5 G
<num> <num> <num> <num> <num> <num> <num>
1: 180 1 69 1.620 2 1.33 1.770
2: 609 1 41 1.695 2 1.40 1.665
干杯,欢迎来到SO!