R 从数据帧列表中提取数据帧,并执行计算
我在dataframeR 从数据帧列表中提取数据帧,并执行计算,r,list,dataframe,R,List,Dataframe,我在dataframerand_sample中有一列,它是dataframe的列表。我只想提取数据帧以在该数据帧内执行计算,然后将这些计算作为新列添加到rand\u sample str(rand_sample[1, ]$times) List of 1 $ :'data.frame': 13 obs. of 2 variables: ..$ white: num [1:13] 1800 1834 1875 1897 1887 ... ..$ black: num [1:13]
rand_sample
中有一列,它是dataframe的列表。我只想提取数据帧以在该数据帧内执行计算,然后将这些计算作为新列添加到rand\u sample
str(rand_sample[1, ]$times)
List of 1
$ :'data.frame': 13 obs. of 2 variables:
..$ white: num [1:13] 1800 1834 1875 1897 1887 ...
..$ black: num [1:13] 1800 1860 1946 2031 2114 ...
第一个索引如下所示:
> rand_sample[1:10,]$times
[[1]]
white black
1 1800 1800
2 1834 1860
3 1875 1946
4 1897 2031
5 1887 2114
6 1839 2203
7 1835 2282
8 1880 2370
9 1875 2400
10 1892 2323
11 1612 2356
12 1622 2370
13 1619 2370
基本上,我想做的事情可以用这个for
循环来表示:
for (i in 1:nrow(rand_sample)) {
current <- rand_sample[i, ]$times[[1]]
mW <- abs(diff(current$white))
mB <- abs(diff(current$black))
maxWhite <- max(mW)
minWhite <- min(mW)
maxBlack <- max(mB)
minBlack <- min(mB)
sdWhite <- sd(mW)
sdBlack <- sd(mB)
avgW <- mean(mW)
avgB <- mean(mB)
rand_sample[i, ]$maxWhite <- maxWhite
rand_sample[i, ]$minWhite <- minWhite
rand_sample[i, ]$maxBlack <- maxBlack
rand_sample[i, ]$minBlack <- minBlack
rand_sample[i, ]$sdWhite <- sdWhite
rand_sample[i, ]$sdBlack <- sdBlack
rand_sample[i, ]$avgTimeWhite <- avgW
rand_sample[i, ]$avgTimeBlack <- avgB
}
就在第一排。我想做一些像这样的事情
rand_samples$dataFrameTimes <- rand_sample$times[[1]]
rand_samples$dataFrameTimes考虑将for
循环转换为一个lappy
数据帧列表(等于rand_sample的行数。然后运行do.call(rbind,…)
将列表中的内容转换为单个数据帧,最后将cbind
转换为rand\u sample。最后的转换将删除现在不需要的时间列:
请提供一个可复制的示例,例如使用dput
的rand_sample
的子集。数据是专有的。还有其他方法吗?哇。这太不可思议了。你帮我省去了这么多麻烦。为什么lapply比for循环快得多?我认为它们基本上是相同的运行时间。太好了!很高兴能提供帮助。两者都有是循环,但这里我们运行批量操作,而不是行操作。
rand_samples$dataFrameTimes <- rand_sample$times[[1]]
dfList <- lapply(rand_sample$times, function(current) {
mW <- abs(diff(current[[1]]$white))
mB <- abs(diff(current[[1]]$black))
data.frame(
maxWhite = max(mW),
minWhite = min(mW),
maxBlack = max(mB),
minBlack = min(mB),
sdWhite = sd(mW),
sdBlack = sd(mB),
avgW = mean(mW),
avgB = mean(mB)
)
})
all_times <- do.call(rbind, dfList)
finaldf <- transform(cbind(rand_sample, all_times), times=NULL)
rand_sample <- data.frame(
ID = vapply(seq(50), function(i) sample(seq(15), 1, replace=TRUE), integer(1)),
GROUP = vapply(seq(50), function(i) sample(LETTERS, 1, replace=TRUE), character(1))
)
rand_sample$times <- lapply(1:50, function(i)
list(data.frame(white=sample(1000:2000, 50),
black=sample(1000:2000, 50))))
head(finaldf)
# ID GROUP maxWhite minWhite maxBlack minBlack sdWhite sdBlack avgW avgB
# 1 3 N 807 3 778 32 212.5353 177.5051 327.4082 297.3469
# 2 12 Q 858 2 892 7 261.3543 222.4173 356.1837 366.7143
# 3 6 R 749 13 910 8 208.5439 233.3391 324.6735 348.2041
# 4 5 V 892 8 886 20 246.3769 261.3922 356.7347 329.5306
# 5 4 O 842 5 886 2 200.1235 257.9464 350.2653 300.7347
# 6 3 T 790 17 908 53 204.7842 235.0276 319.7959 385.1224