R - 根据计数器值创建行

时间:2014-09-02 23:30:43

标签: r

input <- read.table(header=F, text="abc 2 
                def 3 
                pq 2")
colnames(input) <- c("text","count")

我根据文本及其在数据中出现的次数进行输入。 我试图得到将复制文本行的输出显示计数的次数。我很难找到任何可以轻松完成的功能。

预期产出:

output <- read.table(header=F, text="abc 2 
                abc 2
                def 3
                def 3 
                def 3
                pq 2
                pq 2    ")
colnames(output) <- c("text","count")

任何帮助将不胜感激!!

5 个答案:

答案 0 :(得分:2)

或者

as.data.frame(lapply(input, function(x) rep(x, input$count)))
#   text count
# 1  abc     2
# 2  abc     2
# 3  def     3
# 4  def     3
# 5  def     3
# 6   pq     2
# 7   pq     2

答案 1 :(得分:2)

使用data.table

 library(data.table)
 setDT(input)[, .SD[rep(1:.N, count)]]
 #   text count
 #1:  abc     2
 #2:  abc     2
 #3:  def     3
 #4:  def     3
 #5:  def     3
 #6:   pq     2
 #7:   pq     2

或者

  setDT(input)[input[,rep(1:.N, count)]]

答案 2 :(得分:1)

使用行索引:

input[rep(seq(nrow(input)),input$count),]
# or even
input[rep(rownames(input),input$count),]

#    text count
#1    abc     2
#1.1  abc     2
#2    def     3
#2.1  def     3
#2.2  def     3
#3     pq     2
#3.1   pq     2

第二个选项有效,因为您可以按rownames中的字符向量以及colnames进行索引,例如:

rownames(input)
#[1] "1" "2" "3"
input["1",]
#  text count
#1  abc     2

答案 3 :(得分:0)

by应该快速完成这项工作。只需按行处理输入,然后将其全部加入:

output <- do.call(rbind, by(input, rownames(input), function(x) {
  data.frame(text=rep(x$text, x$count), x$count)
}))
rownames(output) <- NULL
colnames(output) <- c("text","count")
print(output)

##   text count
## 1  abc     2
## 2  abc     2
## 3  def     3
## 4  def     3
## 5  def     3
## 6   pq     2
## 7   pq     2

答案 4 :(得分:0)

您可以使用rep

with(input, {
    data.frame(text = rep(levels(text), count), count = rep(count, count))
})

或者,使用辅助函数。两者都返回以下内容。输入数据中的inp

f <- function(j, k) rep(j, k)
data.frame(text = inp$text[f(inp[,1], inp[,2])], count = f(inp[,2], inp[,2]))
#  text count
#1  abc     2
#2  abc     2
#3  def     3
#4  def     3
#5  def     3
#6   pq     2
#7   pq     2