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])
最佳答案
如果您不想重复 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
是您的列之一(df[,2]
、df[,3]
或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
引入到您的 data.frame
中,所以要小心!
关于r - 在 r 中循环一个 rep() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37836433/