2017-09-05 127 views
0

我有一個data.frame(df)具有不同數量的行(numElement),我希望從它中提取X個元素(numExtract),它們在df中均勻分佈並將它們存儲在新的數據幀(extractData)。當我使用下面的腳本時,有時我會得到extractData不同數量的元素(從numExtract中加大一)。我該如何解決它?從數據幀中提取的數據平均分佈 - R

腳本:

numElement<-400 
df<-data.frame(seq(1:numElement)) 

numExtract<-5 
extractData <- df[seq(1, nrow(df), by = round(nrow(df)/numExtract)),] 


numElement<-400 
df<-data.frame(seq(1:numElement)) 

numExtract<-7 

extractData <- df[seq(1, nrow(df), by = round(nrow(df)/numExtract)),] 
+0

你在每次運行得到不同的結果? – Enigma

+0

不,結果相似 – elyraz

+1

使用'by'而不用'round' ?.它將確保'extractData'與'numElement'具有相同數量的元素。 – Enigma

回答

1

我不能發表評論,但還沒有round額外的參數四捨五入到最接近的整數數量。

在第一種情況下,您需要每隔80個元素,然後在第二個情況下每隔57個元素,這意味着您將獲得索引爲1 58 115 172 229 286 343 400(共8個索引)的元素。

0

自定義功能

使用cut,以獲得更直觀的時間間隔,並提取休息。它採用gsubfn:strapply子字符串的提取

library(gsubfn) 
myfun <- function(maxval, numbreaks) { 
       require(gsubfn) 
       x <- unique(cut(1:maxval, numbreaks-1)) 
       A <- sapply(x, function(Z) round(as.numeric(strapply(as.character(Z), "^[(](\\S+)[,]", perl=TRUE)))) 
       A <- c(A, maxval) 
       return(A) 
     } 

輸出

myfun(400, 5) 
# 1 101 200 300 400 

myfun(400, 7) 
# 1 68 134 200 267 334 400 
+0

元素之間的距離不相同(1到68和68到134)。這可以糾正嗎? (出於好奇) – Enigma

+0

'系列< - c(1,68,134,200,267,334,400)'; 'diff(series)''#[1] 67 66 66 67 67 66';這些間隔實際上應相距'66.6666'單位,但輸出需要是一個整數。 – CPak