在r

时间:2016-06-15 13:10:03

标签: r for-loop

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])

1 个答案:

答案 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,所以请小心!