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