df
是一个频率表,其中a
中的值被报告为列x,y,z
中记录的次数。我正在尝试将频率表转换为原始数据,因此我使用 rep()函数。
如何循环rep()
函数给我x,y,z的原始数据,而不必像下面那样多次重复该函数?
另外,我可以将结果输入到数据框中,记住输出将具有不同的列长度:
a <- (1:10)
x <- (6:15)
y <- (11:20)
z <- (16:25)
df <- data.frame(a,x,y,z)
df
rep(df[,1], df[,2])
rep(df[,1], df[,3])
rep(df[,1], df[,4])
答案 0 :(得分:3)
如果您不想重复for循环,可以尝试使用apply
功能。请注意,您无法将其存储在data.frame
中,因为对象的长度不同,但您可以将其存储在列表中,并以与data.frame
类似的方式访问元素。这样的事情有效:
df2<-sapply(df[,2:4],function(x) rep(df[,1],x))
这个sapply
函数说的是df[,2:4]
中的每一列,将rep(df[,1],x)
函数应用到x
是其中一列({1}}的位置},df[,2]
或df[,3]
)。
以下代码只是确保apply函数提供与原始方式相同的结果。
df[,4]
修改强>
如果您希望它作为 identical(df2$x,rep(df[,1], df[,2]))
[1] TRUE
identical(df2$y,rep(df[,1], df[,3]))
[1] TRUE
identical(df2$z,rep(df[,1], df[,4]))
[1] TRUE
对象,您可以执行此操作:
data.frame
请注意,这会将res<-as.data.frame(sapply(df2, '[', seq(max(sapply(df2, length)))))
引入您的NA
,所以请小心!