2017-03-24 86 views
0

的信息,我有两个数据集:ms。该第一数据集包括变量Frequencyp1p2p3梳理两个数据sets_Loop功能

第二数据集包括用于型回归,的值意味着样本大小。列名分别是zmeansamplesize

我需要四列添加到第一数据集m如下:

  • 第一列m$reg1m$p1倍的s$samplesize对应于s$z == 'Regression1'值。
  • 第二列m$reg2应该是m$p2倍对应于s$z == 'regression2'所述的s$samplesize值。
  • 第三列m$reg3应该是m$p3s$samplesize的值对应s$z == 'regression3'

我在想如何编写一个循环函数来计算m个数据集中的这四个新列。

请参阅数据集如何在下面的代码创建:

Frequency<-seq(1,27,1) 
p1<-seq(2,28,1) 
p2<-seq(10,36,1) 
p3<-seq(0,26,1) 
m<-data.frame(Frequency,p1,p2,p3) 

z<-c('Regression1','Regression2','Regression3','Regression4') 
mean<-c(2,28,1,17) 
samplesize<-c(10,20,30,40) 
s<-data.frame(z,mean,samplesize) 

回答

1

使用相同的原则,我们在这个answer应用。首先,定义将表格子集的名称或行值,然后执行计算,将值填充到一个新的,类似构造的列中。

# custom function that calculates column values 
add.col <- function(i){ 
    # name in the s$z that defines the correct row 
    reg <- paste0("Regression", i) 
    # name of the m column 
    p <- paste0("p", i) 
    # multiply the named column from m with respective samplesize in s 
    return(m[, p] * s$samplesize[s$z == reg]) 
} 

# loop through all indices 
for(i in 1:3){ 
    # create a new column with the compound name and fill it with appropriate values 
    m[, paste0("reg", i)] <- add.col(i = i) 
} 
+0

非常感谢您的帮助。 – Joe

1

没有必要为一个循环,如果我正确地理解你的问题。只要做到:

m$regr1 <- m$p1*s$samplesize[s$z=="Regression1"] 
m$regr2 <- m$p2*s$samplesize[s$z=="Regression2"] 
m$regr3 <- m$p3*s$samplesize[s$z=="Regression3"] 
0

如果你想要做一个for循环,这可能工作,以及:

desired_col = c(2,3,4) # this can be any selection 

for(i in desired_col) { m[[paste0(i,"reg")]] = m[,i]*s[match(i,desired_col),3] }

+0

嗨。感谢您的回复。但是我不能使用m [,i + 1],因为我有一个很大的数据集,并且这些列不是连续的。你能修改你的代码吗? – Joe

+0

是的,编辑后的版本可以选择任意列,并从顺序选择“s”中的第一个到最后一个样本大小值。假定cols的nr与's'中的行的nr匹配。还可以创建与desired_reg的载体中选择期望的样本大小为每次迭代(例如,'desired_reg = C(“Regression1”,“Regression2”)' – timfaber