2015-12-04 31 views
1

我有许多重复权重,我想创建一个每个权重的数据集,其中权重乘以权重的观察数,所以数据集1中的观察值乘以权重1。我可以做到这一点,而不是以非常方式。根据不同变量生成多个数据集

这里有一些数据:

df <- data.frame(id <- seq(1:100), 
      x = rnorm(100), 
     y = x + rnorm(100), 
     X1 = round(runif(100,0,2),0), 
     X2 = round(runif(100,0,2),0), 
     X3 = round(runif(100,0,2),0), 
     X4 = round(runif(100,0,2),0), 
     X5 = round(runif(100,0,2),0)) 

,这通过复制权重的意见。

df1 <- df[rep(row.names(df), df$X1), 1:3] 
df2 <- df[rep(row.names(df), df$X2), 1:3] 
df3 <- df[rep(row.names(df), df$X3), 1:3] 
df4 <- df[rep(row.names(df), df$X4), 1:3] 
df5 <- df[rep(row.names(df), df$X5), 1:3] 

是否有可能做到这一点的一条线 - 最好是不用每次都不必名称X,因为可能有很多两个X

回答

3

的如果有名称以“X”开头的列接着是数字,我们使用grep从模式(^X\\d+)中提取原始数据集('df')中的那些列名称。

nm1 <- grep('^X\\d+', names(df), value=TRUE) 

然后,我们遍历所有的“NM1”,复制行的由值序列(seq_len(nrow(df)))在由“NM1”指定的列,选择第3列(1:3)。输出将是list

lst <- lapply(nm1, function(nm) df[rep(seq_len(nrow(df)), df[,nm]),1:3]) 

在一般情况下,最好是使用lst所有的操作,因为我们可以在list环境本身(包括导出输出到文件)内完成大部分的分析。但是,如果我们坚持要在全局环境中显示多个数据集对象,则在用对象名命名'lst'元素后,一个选项是list2env

list2env(setNames(lst, paste0('df', seq_along(lst))), envir=.GlobalEnv) 
+1

@Frank谢谢你的提醒,我在写评论的时候写了描述。 – akrun

+1

感谢您的回答和解释 –

相关问题