“For 循环”中的新数据集

问题描述 投票:0回答:1

我是“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. 如何删除所有列(条件 1 - 4)中包含零值的行?

  2. 如何计算各个平均值(我的想法是使用“for 循环”)?

提前致谢

史蒂芬

(如何上传示例文件?)

r for-loop
1个回答
0
投票

如果您通过

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!

© www.soinside.com 2019 - 2024. All rights reserved.