根据不同的变量

时间:2015-12-04 15:19:31

标签: r

我有一些重复权重,我想为每个权重创建一个数据集,其中权重乘以加权的观察数量,因此数据集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

1 个答案:

答案 0 :(得分:3)

如果有许多列的名称以'X'开头,后跟数字,我们使用grep从原始数据集('df')中提取带有模式({{1})的列名称})。

^X\\d+

然后,我们遍历'nm1',通过'nm1'指定的列中的值复制行序列(nm1 <- grep('^X\\d+', names(df), value=TRUE) ),选择前3列(seq_len(nrow(df)))。输出将是1:3

list

通常,最好将lst <- lapply(nm1, function(nm) df[rep(seq_len(nrow(df)), df[,nm]),1:3]) 用于所有操作,因为我们可以在lst环境中进行大部分分析(包括将输出导出到文件)。但是,如果我们坚持要在全局环境中显示多个数据集对象,则在使用对象名称命名'lst'元素后,一个选项为list

list2env