循环遍历数据集列并计算R中的统计信息
我只是从R开始,需要帮助循环数据集和计算统计数据 我有两个数据集:循环遍历数据集列并计算R中的统计信息,r,R,我只是从R开始,需要帮助循环数据集和计算统计数据 我有两个数据集: >head(windows) W1 W1 W2 W2 W3 W4 W4 W5 ... >head(values) # this is very large file (>20Gb) Case1 Case2 Case3 Case4 ... 21 19 14 64 14 24 48 13 21 34
>head(windows)
W1
W1
W2
W2
W3
W4
W4
W5
...
>head(values) # this is very large file (>20Gb)
Case1 Case2 Case3 Case4 ...
21 19 14 64
14 24 48 13
21 34 65 83
45 53 25 63
62 32 72 11
24 75 12 66
12 23 73 37
45 23 56 74
...
我该做什么:
For cases in values
join row by row with windows
For every window
Calculate mean
end
end
值中的每个案例
列
将其与窗口
逐行连接;
应该是这样的(Case1
):
W121
W114
W2 21
W2 45
W3 62
W4 24
W4 12
W5 45
窗口
组,例如:
- W1(案例1):21,14
- W2(案例1):21,45
- W3(案例1):62
- W4(案例1):24,12
- W5(案例1):45
- W1(案例2):19,24
Case1 Case2 Case3 Case4
W1 17.50 21.50 mean mean
W2 33.00 mean mean mean
W3 62.00 mean mean mean
W4 18.00 mean mean mean
W5 45.00 mean mean mean
伪代码可能是:
For cases in values
join row by row with windows
For every window
Calculate mean
end
end
注意:我已尝试使用
rbind
、merge
、data.frame
将windows
与值连接起来,但数据集太大,进程被终止 由于您有一个相当大的数据文件,我认为有两个很好的选择,使用data.table
或dplyr
。下面是使用dplyr
的方法
但首先,我认为您并不是真的想要合并
值
和窗口
。根据您的描述,我认为您要做的是添加windows
,作为值的附加列(因为似乎没有可以合并的内容)
因此,我首先在values
中创建该附加列。(我在这里假设,windows
是一个向量,虽然您的问题不清楚,但它也可能是一个data.frame,但您可以在这种情况下执行非常类似的操作):
方法2:
使用summary_each
对所有列执行相同的操作,分组变量除外(本例中为窗口)。如果要对大量列执行相同的操作,这样可以节省键入的时间。另外,如果需要,可以指定更多要计算的函数,例如平均值和中值
library(dplyr) # if it's not yet loaded
values %>%
group_by(windows) %>%
summarise_each(funs(mean(., na.rm=TRUE)))
两种情况下的结果相同:
# windows Case1 Case2 Case3 Case4
#1 W1 17.5 21.5 31.0 38.5
#2 W2 33.0 43.5 45.0 73.0
#3 W3 62.0 32.0 72.0 11.0
#4 W4 18.0 49.0 42.5 51.5
#5 W5 45.0 23.0 56.0 74.0
编辑
下面是一个示例,其中包含大量样本数据,包括从矩阵到data.frame/vector的转换。如果从“big.matrix”到“matrix”的转换是有效的,那么我认为,这应该与原始数据的工作方式相同
# create a matrix with 100 columns and 5 million rows for per column
m <- matrix(runif(100*5e6), ncol=100)
dim(m)
#[1] 5000000 100
object.size(m)
# 4000000200 bytes
# convert to data.frame
df <- as.data.frame(m)
# create a second matrix "windows" with a single column
windows <- matrix(sample(1:1000, nrow(df), replace=TRUE), ncol = 1)
# convert matrix "windows" to vector
windows.vec <- as.vector(windows[,1])
# add windows.vec as a grouping variable to "df"
df$windows <- windows.vec # you could also do this directly from the "windows" matrix
# check dimensions of "df"
dim(df)
#[1] 5000000 101
# now you can do the calculation
df %>%
group_by(windows) %>%
summarise_each(funs(mean(., na.rm=T), median(., na.rm=TRUE)))
#创建一个矩阵,每列包含100列和500万行
m这绝不是最优雅的解决方案,但它似乎只需将值
数据堆叠到一列中,然后使用一个tapply()函数即可实现您想要的功能。它还可以防止将窗口
因子和值
数据绑定在一起
首先,一个小样本数据集,类似于上述格式:
> set.seed(42)
> values <- data.frame(replicate(4, sample(1:100, 1e3, replace=T)))
> head(values)
[,1] [,2] [,3] [,4]
[1,] 85 34 42 77
[2,] 21 3 72 66
[3,] 36 45 77 14
[4,] 78 50 7 31
[5,] 51 89 42 92
[6,] 61 23 55 2
> windows <- rep(1:(1e3/2), each=2)
> head(windows)
[1] 1 1 2 2 3 3
并重复windows值以匹配堆叠数据帧的长度:
> windows <- rep(windows, 4)
样本输出:
1 2 3 ...
X1 50.0 81.5 39.5
X2 36.0 26.5 52.5
X3 68.5 77.5 85.5
X4 52.0 90.0 91.5
看看“data.table”包。谢谢您的回答,但是在运行values时,$windows是windows
vector还是data.frame?它的长度(如果是向量)或行数和列数(如果是data.frame)是多少,值有多少行和列?dim(values)=5838178 192
,值是矩阵
;windows是matrix
和nrow=5838178
哦,好的,我以为我们在谈论data.frames。在这种情况下,矩阵的困难在于它们只能存储一种类型的值(例如,只能存储数字或字符)。和dplyr
仅适用于data.frames/data.tables(非矩阵)。在运行我的答案中的代码之前,您可以尝试以下操作:values.df顺便问一下,这两个对象是如何创建的?为了避免转换,最好首先直接将它们创建为data.frames。
> windows <- rep(windows, 4)
> tapply(values$values, list(values$ind, windows), mean)
1 2 3 ...
X1 50.0 81.5 39.5
X2 36.0 26.5 52.5
X3 68.5 77.5 85.5
X4 52.0 90.0 91.5