【发布时间】:2013-12-19 00:12:59
【问题描述】:
我有一个数据框,其中包含如此排列的选票和政党标签
dat <- data.frame( v1=c(25, 0, 70),
v2=c(75, 100, 20),
v3=c(0, 0, 10),
l1=c("pA", ".", "pB"),
l2=c("pB", "pC", "pC"),
l3=c(".", ".", "pD") )
这样每一行都是一个分析单元。只有得票方需要考虑,这个函数提取正票或相应的标签
getpos <- function(vector, vorl="v"){ # change to "l" to report labels
vot <- vector[grep( "v", colnames(vector) )];
lab <- vector[grep( "l", colnames(vector) )];
if (vorl=="v") {vot[vot>0]} else {lab[vot>0]};
}
getpos(dat[1,]) # votes for obs 1
getpos(dat[1,], vorl="l") # labels for obs 1
我希望在数据帧 dat 的每一行中运行函数 getpos 以生成具有不同长度的投票/标签向量的列表。应用该函数并没有返回我所期望的:
apply(X=dat, MARGIN=1, FUN=getpos, vorl="l")
谁能发现问题?和相关的,这可以更有效地实现吗?
【问题讨论】:
-
apply所做的第一件事是将dat转换为矩阵,这将导致您的所有数字都转换为字符。您需要从根本上重新考虑如何组织这些数据。可能是长而不是宽格式。 -
其次@joran 的评论 - 如果您重组为
data.frame(number=c(1,1,2,3,3,3), party=c("pA","pB","pC","pB","pC","pD"), votes=c(25,75,100,70,20,10))之类的东西,您将更适合使用aggregate函数等。 -
@joran 的组织建议看起来很有希望,我会尝试并报告。谢谢!