gpt4 book ai didi

list - 按列表子集 data.frame 并按行在每个部分上应用函数

转载 作者:行者123 更新时间:2023-12-01 22:51:38 25 4
gpt4 key购买 nike

这似乎是一个典型的 plyr 问题,但我有一些不同的想法。这是我要优化的函数(跳过 for 循环)。

# dummy data
set.seed(1985)
lst <- list(a=1:10, b=11:15, c=16:20)
m <- matrix(round(runif(200, 1, 7)), 10)
m <- as.data.frame(m)


dfsub <- function(dt, lst, fun) {
# check whether dt is `data.frame`
stopifnot (is.data.frame(dt))
# check if vectors in lst are "whole" / integer
# vector elements should be column indexes
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol
# fall if any non-integers in list
idx <- rapply(lst, is.wholenumber)
stopifnot(idx)
# check for list length
stopifnot(ncol(dt) == length(idx))
# subset the data
subs <- list()
for (i in 1:length(lst)) {
# apply function on each part, by row
subs[[i]] <- apply(dt[ , lst[[i]]], 1, fun)
}
# preserve names
names(subs) <- names(lst)
# convert to data.frame
subs <- as.data.frame(subs)
# guess what =)
return(subs)
}

现在是一个简短的演示……实际上,我将要解释我的主要目的。我想通过 list 对象中收集的向量对 data.frame 进行子集化。由于这是心理学研究中伴随数据操作的函数的代码的一部分,您可以将 m 视为人格问卷(10 个主题,20 个变量)的结果。列表中的向量包含定义问卷子量表(例如人格特质)的列索引。每个分量表由几个项目定义(data.frame 中的列)。如果我们假设每个子量表的分数只不过是行值(每个主题问卷那部分的结果)的 sum(或其他函数),您可以运行:

> dfsub(m, lst, sum)
a b c
1 46 20 24
2 41 24 21
3 41 13 12
4 37 14 18
5 57 18 25
6 27 18 18
7 28 17 20
8 31 18 23
9 38 14 15
10 41 14 22

我瞥了一眼这个函数,我必须承认这个小循环根本没有破坏代码......但是,如果有更简单/有效的方法来做到这一点,请告诉我!

最佳答案

我会采取不同的方法,将所有内容都保留为数据框,以便您可以使用合并和 ddply。我想您会发现这种方法更通用一些,而且更容易检查每个步骤是否正确执行。

# Convert everything to long data frames
m$id <- 1:nrow(m)

library(reshape)
obs <- melt(m, id = "id")
obs$variable <- as.numeric(gsub("V", "", obs$variable))

varinfo <- melt(lst)
names(varinfo) <- c("variable", "scale")

# Merge and summarise
obs <- merge(obs, varinfo, by = "variable")

ddply(obs, c("id", "scale"), summarise,
mean = mean(value),
sum = sum(value))

关于list - 按列表子集 data.frame 并按行在每个部分上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com