2014-09-02 115 views
1
input <- read.table(header=F, text="abc 2 
       def 3 
       pq 2") 
colnames(input) <- c("text","count") 

我輸入的是文本及其在數據中出現的次數。 我想獲得將重複顯示計數的次數的文本行的輸出。我正在努力尋找任何可以輕鬆完成的功能。R - 根據計數器值創建行

預期輸出:

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

任何幫助將不勝感激!

回答

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 
+0

謝謝大家。我最終使用了David的解決方案。學習了很多不同的方法來實現輸出。 – 2014-09-03 14:06:59

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 
+0

雖然它的工作原理似乎有點奇怪,重複每一列的值重複行。 – thelatemail 2014-09-02 23:50:16

+0

@thelatemail,不知道你的意思。我認爲如果你將代碼分解成部分,你將會得到邏輯。這是我想起來的第一件事...... – 2014-09-02 23:51:59

+0

我明白這是如何工作的,但看到我的答案只是使用索引來重複行。它需要爲數據集的每一列重複「rep」。如果你重複行,那麼在行上而不是在列上操作似乎是有意義的。 – thelatemail 2014-09-02 23:53:34

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