我正在尝试从.xls
文件中导出数据,方法是将其转换为包含一式三份数据的.txt
,第一行和第一列包含名称。我想创建另一个数据框(没有第一行和第一列),我将在其中执行我的一式三份。
我试过这个:
fileavg <- readline(prompt="Add your .txt file")
data <- read.table(fileavg, header=FALSE)
a <- 2
b <- a + 2
var <- 0
l1 <- nrow(data) - 1
l2 <- ncol(data) - 1
l0 <- l1 / 3
avg <- 0
for (n in (1:l0)) {
for (j in (2:(l2+1))) {
for (i in (a:b)) {
avg[n,(j-1)] <- avg[n,(j-1)] + data[i,j]
}
avg[n,(j-1)] <- avg[n,(j-1)] / 3
}
a <- a + 3
b <- b + 3
}
例如,我可以使用的典型.txt:
Well t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19
A1 0,53 0,35 0,51 0,69 1,01 1,01 1,34 1,51 2,31 3,14 5,85 6,19 9,7 10,41 12,57 14,34 15,96 18,53 22,18
A2 1,04 0,83 0,84 0,84 0,83 1,04 1,42 1,82 2,77 2,77 6,37 6,76 10,9 8,99 14,15 13,96 19,44 18,52 24,16
A3 1,08 0,9 0,9 0,9 0,73 0,73 1,91 1,74 3,85 3,68 6,32 5,82 10 9,68 14,61 13,09 20,21 21,27 27,06
A4 1,58 1,13 1,35 1,35 2,03 2,03 2,41 2,63 2,81 2,81 3,31 2,89 4,56 4,37 7,21 6,82 10,71 9,96 14,7
A5 0,58 0,39 0,6 0,6 0,78 0,98 1,54 1,35 2,88 3,06 4,23 3,87 8,98 11,44 16,83 15,68 23,15 21,1 28,05
A6 1,04 0,62 1,24 1,04 1,43 1,43 1,35 1,35 2,09 1,9 3,6 3,24 5,75 5,05 9,98 7,82 13,27 11,17 17,42
B1 0,87 0,87 0,91 0,91 2,17 5,07 11,54 21,65 40,25 57,63 83,22 90,98 96,24 97,98 99,06 99,19 99,72 100 56,28
B2 0,33 0,33 0,77 0,77 1,56 4,11 8,11 11,95 23,02 32,34 54,12 65,72 84,72 93,41 97,1 98,74 99,63 99,88 99,88
B3 1,57 1,4 1,45 1,29 2,78 4,1 8,41 13,04 21,66 25,25 43,06 52,69 68,83 77,72 91 94,37 98,37 99,32 99,87
B4 0,44 0,22 0,45 0,45 0,46 0,93 0,9 1,13 1,74 2,17 2,95 2,53 5,16 4,96 9,73 8,78 11,79 12,14 15,44
B5 0 0 0 0 0,22 0,89 3,13 3,55 5,5 6,92 10,13 10,71 18,28 17,73 27,62 27,8 36,12 37,65 44,08
B6 0 0 0,4 0,4 0,96 1,73 3,98 5,88 11,35 13,27 18,23 20,4 30,02 28,69 40,71 41,01 48,98 46,78 54,03
C1 1,25 1,08 0,93 0,74 0,92 0,73 3,55 2,66 6,17 7,89 13,27 11,73 22,78 18,79 34,71 30,86 44,79 38,08 23,95
C2 0,58 0,39 0,6 0,6 0,39 0,98 1,97 2,17 3,67 4,77 7,52 8,44 11,88 11,35 18,38 17,53 23,95 22,77 34,4
C3 0,91 0,54 1,06 0,89 1,73 2,25 2,39 3,08 4,82 5,95 9,86 9,86 16,85 13,9 23,94 17,72 30,19 23,91 38,07
C4 1,17 0,97 1,19 0,68 2,45 4,89 13,51 21,09 47,6 58,21 81,35 84,82 96,85 98,18 99,68 99,84 99,84 100 100
C5 0,57 0,57 1 0,83 4,56 16,45 48,05 68,08 92,87 95,69 99,2 99,36 100 100 100 99,69 100 100 100
C6 0 0 0,33 0 3,21 7,78 26,86 40,71 72,37 82,24 94,64 96,27 99,2 99,84 99,84 100 100 100 100
D1 4,86 10,44 30,43 52,31 80,4 89,13 96,37 98,33 99,73 99,86 99,87 100 100 100 100 100 100 100 100
D2 5,14 15,83 38,47 55,48 82,25 89,72 97,39 98,62 99,87 99,87 100 100 100 100 100 100 100 100 100
D3 3,32 9,56 26,45 45,21 76,14 85,92 96,57 97,89 100 100 100 100 100 100 100 99,75 100 100 100
D4 0,93 0,93 1,23 1,41 2,09 2,62 3,97 4,49 5,75 7 8,91 10,91 17 20,84 29,47 34,44 40,19 45,47 50,65
D5 0,85 0 1,23 1,38 1,67 2,12 2,93 4,78 6,97 8,4 10,6 13,29 18,49 22,99 27,94 33,17 42,24 47,03 53,63
D6 0,31 0,15 0,69 0,83 1,35 1,75 2,84 4,05 7,48 9 12,62 15,12 18,49 21,05 25,64 30,95 36,56 37,86 46,96
E1 0,68 1,19 1,47 1,8 4,46 7,6 16,41 21,32 40 48,7 65,99 70,92 83,14 83,81 93,23 93,39 98,06 98,06 99,36
E2 0,21 0,21 0,22 0,22 0,22 0,43 0,64 0,64 0,64 0,64 2,03 2,03 3,8 4 6,01 7,3 10,93 11,13 15,15
E3 0,65 0,98 2,37 2,84 10,14 17,55 31,81 41,27 57,75 62,81 75 77,63 87,15 88,65 95 95,83 98,04 98,04 98,28
E4 1,51 1,29 1,34 1,34 1,55 1,32 1,55 1,33 2,44 2,44 2,79 2,58 5,26 5,26 7,16 7,39 11,42 10,72 13,95
E5 0,8 0,4 1,02 1,02 1,64 1,43 1,78 1,78 1,76 1,95 2,16 1,96 3,46 2,88 4,54 3,55 7,35 8,32 10,77
E6 0,2 0,2 0,19 0,19 0,75 0,75 1,23 0,7 2,02 1,18 2,6 1,95 5,27 4,97 9,64 7,01 11,21 10,6 14,84
F1 0 0 0,2 0,2 0,2 0,2 0,21 0,41 0,2 0,41 0,59 0,79 1,99 2,19 7,59 8,64 14,29 14,01 32,27
F2 0,95 0,95 0,95 0,95 1,18 0,98 1,54 1,35 3,45 4,02 5,17 6,32 8,41 8,6 13,62 36,56 28,1 26,59 37,62
F3 0,72 0,72 0,36 0,36 0,36 0,72 1,1 1,65 2,2 2,54 3,9 4,07 6,46 7,82 11 25,09 26,67 24,67 38,85
F4 0,22 0,22 0,22 0,22 0,22 0,22 0,64 0,64 1,32 1,1 2,42 2,2 5,92 7,02 13,06 11,88 15,64 16,11 19,15
F5 0,68 0,45 1,11 1,33 0,66 0,66 0,64 1,06 1,68 1,47 2,13 2,35 2,55 3,83 5,73 6,83 9,26 9,03 12,68
F6 0 0 0 0 0,2 0,2 0,19 0,37 0,73 0,73 1,37 0,86 1,81 1,15 3,38 3,22 3,83 4,17 7,36
G1 0,47 0,47 0,44 0,44 0,41 1,43 6,69 8,72 20,4 31,59 54,26 63,65 87,72 94,39 99,82 99,12 100 100 100
G2 0,92 0,73 0,87 1,05 2,38 7,92 14,96 23,17 46,56 61,99 85,69 92,3 96,63 97,9 99,86 100 100 100 100
G3 0,59 0,59 1,03 2,23 12,42 21,24 32,92 46,08 76,8 88,02 96,04 98,33 99,4 100 100 100 100 100 100
G4 0,41 0,41 0,42 0,42 0,62 0,42 0,6 0,6 0,6 0,4 1,38 1,58 2,2 2,61 4,15 5,09 5,99 8,24 10,96
G5 0,85 0,85 1,1 1,1 0,9 0,9 1,1 1,1 1,41 1,87 1,84 2,76 4,43 3,77 6,25 7,64 9,57 10,53 11,9
G6 0,61 0,4 0,39 0,2 0,19 0 0 0,39 0,74 0,55 0,93 0,75 2,13 1,42 4,22 3,34 6,7 5,33 9,71
H1 1,62 1,62 1,54 1,85 2,11 2,11 1,97 1,97 1,78 1,78 2,48 2,75 3,18 2,92 5,61 5,61 7,33 8,38 11,87
H2 1,32 1,32 1,23 1,23 0,74 0,98 2,26 1,25 3,42 3,91 7,29 7,76 10,83 14,75 19,65 30,02 43,62 51,65 72,69
H3 0,88 0,88 0,85 0,56 0,55 0,55 0,92 0,92 1,11 1,11 1,35 2,16 3,54 4,63 10,05 15,98 28,24 37,05 46,79
H4 0,27 0,27 0,26 0 0,26 0,26 0,28 0,28 0,48 0,72 1,19 0,71 0,93 1,64 2,78 3,25 7,85 7,62 8,51
H5 0,55 0,55 0,78 0,78 0,53 0,53 0,83 0,83 0,81 0,81 1,26 1,26 1,72 1,47 4,31 3,83 5,59 5,83 8,67
H6 0 0 0 0 0 0 0 0 0 0 0,8 0,8 1 1,25 1,96 1,22 3,25 3,02 5,97
一式三份是行,因此,例如,对于我的"最终"数据框的大小写 (1,1),我想做 t1 列和行 A1、A2、A3 的情况的平均值。
所以当我尝试这个时,我得到:
我avg[n, (j - 1)] 中的错误:维度数不正确
试图在其他地方找到答案,但我找不到真正符合我的情况的东西。我真的是编码的初学者,所以我可能有一种非常奇怪的方法来做到这一点。
您的read.table
应使用dec=","
。
下面是使用 dplyr
避免循环的解决方案(存在基本 R 解决方案):
# we use ',' as decimal sign, we consider the first row as header (drops it in a way), and remove the first column
data <- read.table(fileavg, header=TRUE, dec=",")[, -1]
# we load dplyr. install.packages("dplyr") if you don't have it
library(dplyr)
# The number of triplicates (be careful since some may be dropped)
nr <- floor(nrow(data)/3)
# we create a grouping variable, and average each column within each group
data %>% mutate(group=factor(rep(1:nr, each=3))) %>%
group_by(group) %>%
summarise_each(funs(mean)) %>%
ungroup()
Source: local data frame [16 x 20]
group t1 t2 t3 t4 t5 t6 t7
(fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1 1 0.8833333 0.69333333 0.7500000 0.8100000 0.8566667 0.9266667 1.5566667
2 2 1.0666667 0.71333333 1.0633333 0.9966667 1.4133333 1.4800000 1.7666667
3 3 0.9233333 0.86666667 1.0433333 0.9900000 2.1700000 4.4266667 9.3533333
4 4 0.1466667 0.07333333 0.2833333 0.2833333 0.5466667 1.1833333 2.6700000
5 5 0.9133333 0.67000000 0.8633333 0.7433333 1.0133333 1.3200000 2.6366667
文件中的十进制数字用逗号分隔。为了正确读取数据,需要指定此事实。
如果samplefile.txt
是.txt
文件的名称,请尝试:
data <- read.table("samplefile.txt", header=TRUE, dec=",")
读取文件,将标题行保留为列名 ( header=T
) 并解释数字语法 ( dec=','
),则可以将 aggregate()
与合成分组列一起使用来计算一式三份意味着:
df <- read.table('input.txt',header=T,dec=',');
aggregate(.~trip,cbind(df[-1L],trip=rep(seq_len(nrow(df)%/%3L),each=3L)),mean);
## trip t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19
## 1 1 0.8833333 0.69333333 0.7500000 0.8100000 0.8566667 0.9266667 1.5566667 1.6900000 2.9766667 3.196667 6.180000 6.2566667 10.200000 9.693333 13.776667 13.796667 18.536667 19.440000 24.466667
## 2 2 1.0666667 0.71333333 1.0633333 0.9966667 1.4133333 1.4800000 1.7666667 1.7766667 2.5933333 2.590000 3.713333 3.3333333 6.430000 6.953333 11.340000 10.106667 15.710000 14.076667 20.056667
## 3 3 0.9233333 0.86666667 1.0433333 0.9900000 2.1700000 4.4266667 9.3533333 15.5466667 28.3100000 38.406667 60.133333 69.7966667 83.263333 89.703333 95.720000 97.433333 99.240000 99.733333 85.343333
## 4 4 0.1466667 0.07333333 0.2833333 0.2833333 0.5466667 1.1833333 2.6700000 3.5200000 6.1966667 7.453333 10.436667 11.2133333 17.820000 17.126667 26.020000 25.863333 32.296667 32.190000 37.850000
## 5 5 0.9133333 0.67000000 0.8633333 0.7433333 1.0133333 1.3200000 2.6366667 2.6366667 4.8866667 6.203333 10.216667 10.0100000 17.170000 14.680000 25.676667 22.036667 32.976667 28.253333 32.140000
## 6 6 0.5800000 0.51333333 0.8400000 0.5033333 3.4066667 9.7066667 29.4733333 43.2933333 70.9466667 78.713333 91.730000 93.4833333 98.683333 99.340000 99.840000 99.843333 99.946667 100.000000 100.000000
## 7 7 4.4400000 11.94333333 31.7833333 51.0000000 79.5966667 88.2566667 96.7766667 98.2800000 99.8666667 99.910000 99.956667 100.0000000 100.000000 100.000000 100.000000 99.916667 100.000000 100.000000 100.000000
## 8 8 0.6966667 0.36000000 1.0500000 1.2066667 1.7033333 2.1633333 3.2466667 4.4400000 6.7333333 8.133333 10.710000 13.1066667 17.993333 21.626667 27.683333 32.853333 39.663333 43.453333 50.413333
## 9 9 0.5133333 0.79333333 1.3533333 1.6200000 4.9400000 8.5266667 16.2866667 21.0766667 32.7966667 37.383333 47.673333 50.1933333 58.030000 58.820000 64.746667 65.506667 69.010000 69.076667 70.930000
## 10 10 0.8366667 0.63000000 0.8500000 0.8500000 1.3133333 1.1666667 1.5200000 1.2700000 2.0733333 1.856667 2.516667 2.1633333 4.663333 4.370000 7.113333 5.983333 9.993333 9.880000 13.186667
## 11 11 0.5566667 0.55666667 0.5033333 0.5033333 0.5800000 0.6333333 0.9500000 1.1366667 1.9500000 2.323333 3.220000 3.7266667 5.620000 6.203333 10.736667 23.430000 23.020000 21.756667 36.246667
## 12 12 0.3000000 0.22333333 0.4433333 0.5166667 0.3600000 0.3600000 0.4900000 0.6900000 1.2433333 1.100000 1.973333 1.8033333 3.426667 4.000000 7.390000 7.310000 9.576667 9.770000 13.063333
## 13 13 0.6600000 0.59666667 0.7800000 1.2400000 5.0700000 10.1966667 18.1900000 25.9900000 47.9200000 60.533333 78.663333 84.7600000 94.583333 97.430000 99.893333 99.706667 100.000000 100.000000 100.000000
## 14 14 0.6233333 0.55333333 0.6366667 0.5733333 0.5700000 0.4400000 0.5666667 0.6966667 0.9166667 0.940000 1.383333 1.6966667 2.920000 2.600000 4.873333 5.356667 7.420000 8.033333 10.856667
## 15 15 1.2733333 1.27333333 1.2066667 1.2133333 1.1333333 1.2133333 1.7166667 1.3800000 2.1033333 2.266667 3.706667 4.2233333 5.850000 7.433333 11.770000 17.203333 26.396667 32.360000 43.783333
## 16 16 0.2733333 0.27333333 0.3466667 0.2600000 0.2633333 0.2633333 0.3700000 0.3700000 0.4300000 0.510000 1.083333 0.9233333 1.216667 1.453333 3.016667 2.766667 5.563333 5.490000 7.716667
关于您的错误消息,问题是您将avg
初始化为向量(一维数据类型),但随后您尝试将其索引为矩阵(二维数据类型)。您可以通过像这样初始化avg
来解决问题:
avg <- matrix(0,l0,l2);
但是数据类型问题(由 (1) 省略 dec=','
参数和 (2) 在标题行中读取数据行引起的)无论如何仍然是一个问题。
-
read.table()
-
aggregate()
-
cbind()
-
seq_len()
-
rep()