在R中创建一个完成以下操作的函数

时间:2014-04-07 13:53:13

标签: r

列A-F是标识列 - (1,0)。 G列的值为" WLB0"," WLB2":" WLB10"和" WLB46"," WLB89"。

我正在尝试对列G的每个A-F排列进行以下操作

我正在寻找一个函数来调用而不是使用我编写的这个非常笨拙的代码来执行它。

测试数据可在底部下载。

X1 <- {dd <- subset(TEST, TEST$A == 1 & TEST$G =="WLB10"); de <-transform(dd, RP = sum(dd$I)/sum(dd$H));mean(de$RP)}

X2 <- {dd <- subset(TEST, TEST$A == 1 & TEST$G =="WLB8"); de <-transform(dd, RP = sum(dd$I)/sum(dd$H));mean(de$RP)}

X3 <- {dd <- subset(TEST, TEST$B == 1 & TEST$G =="WLB10"); de <-transform(dd, RP = sum(dd$I)/sum(dd$H));mean(de$RP)}

TEST1$finalnumber <-ifelse(TEST1$A == 1 & TEST1$G == "WLB10", X1,

                       ifelse(TEST1$A == 1 & TEST1$G == "WLB8", X2,

                              ifelse(TEST1$B == 1 & TEST1$G == "WLB10", X3, 0)))

测试数据

&#34; https://s3.amazonaws.com/RProgramming/TEST.csv&#34;

&#34; https://s3.amazonaws.com/RProgramming/TEST1.csv&#34;

1 个答案:

答案 0 :(得分:1)

我对在de行中设置RP保持不变的目的感到有点困惑,但是我希望下面的代码可以帮助你。 ddplymelt是这类事情的两大功能

library(plyr)
library(reshape)
long <-  melt(TEST, measure.vars=LETTERS[1:6])
#long <- subset(variable==1)
shorter <- ddply(long, .(G, variable, value), summarize, RP=sum(I)/sum(H))

您可以取消注释该行只是获取与 1 相对应的小计,但我认为它是说明性的,以告诉您它是如何工作的。

然后,您可以在TEST1上执行类似的融合,并执行相关值的查找:

long <-  melt(TEST1, measure.vars=LETTERS[1:6])
ind <-  match(paste0(long$G, long$variable), paste0(shorter$G, shorter$variable))
long$final <- shorter$RP[ind]