我有一个两列数据框,其左列中的值和右列中该值的频率。我想在一个只有一列的新数据框中反映这些数据。
我已经使用了下面的2 for循环,但是我的数据(100k +行和许多数据帧)非常慢。我尝试过使用apply函数,但无法解决问题。
library(tidyverse)
twocol <- tribble(
~value, ~count,
0.23076923, 5,
0.69076923, 3,
1.15230769, 4,
1.61384615, 4,
2.15230769, 3
) %>% as.data.frame()
make_onecol <- function(df) {
dfnew <- data.frame(value=NA)
df %>% filter(count!=0) -> df
for (i in 1:nrow(df)) {
n <- df[i, 2]
for (j in 1:n) {
dfnew <- rbind(dfnew, df[i, 1])
}
}
return(dfnew)
}
onecol <- make_onecol(twocol)
答案 0 :(得分:3)
你可以使用rep
- 函数。使用:
onecol <- data.frame(value = c(NA, rep(twocol$value, twocol$count)))
给出:
> onecol value 1 NA 2 0.2307692 3 0.2307692 4 0.2307692 5 0.2307692 6 0.2307692 7 0.6907692 8 0.6907692 9 0.6907692 10 1.1523077 11 1.1523077 12 1.1523077 13 1.1523077 14 1.6138462 15 1.6138462 16 1.6138462 17 1.6138462 18 2.1523077 19 2.1523077 20 2.1523077
答案 1 :(得分:1)
rep
包装data.table
:
library(data.table)
setDT(twocol)[, .(value = rep(value, count))]
# value
# 0.2307692
# 0.2307692
# 0.2307692
# 0.2307692
# 0.2307692
# 0.6907692
# 0.6907692
# 0.6907692
# 1.1523077
# 1.1523077
# 1.1523077
# 1.1523077
# ...