簡體   English   中英

通過條件在另一個data.frame中選擇行,而R中沒有for循環

[英]Select rows by criteria in another data.frame without for loop in R

這與問題有關: 如何從一個數據框中提取行(使用循環)並將其保存在另一個數據框中

如果ddf的“ POS”位於refdf的“開始”和“結束”之間,則需要將其包含在與ddf具有相同結構的outdf中。 我可以使用“ for”循環來管理它,但是可以不使用“ for”循環來完成它嗎?

ddf = structure(list(POS = c(23L, 48L, 5L), Freq1 = c(0.5, 0.7, 0.8
), Freq2 = c(0.45, 0.55, 0.65)), .Names = c("POS", "Freq1", "Freq2"
), class = "data.frame", row.names = c(NA, -3L))

refdf = structure(list(Start = c(1L, 25L, 60L), End = c(10L, 50L, 75L
)), .Names = c("Start", "End"), class = "data.frame", row.names = c(NA, 
-3L))

ddf
#  POS Freq1 Freq2
#1  23   0.5  0.45
#2  48   0.7  0.55
#3   5   0.8  0.65

refdf
#  Start End
#1     1  10
#2    25  50
#3    60  75


outdf = data.frame(POS=numeric(), Freq1=numeric(), Freq2=numeric())
for(i in 1:nrow(ddf)) for(j in 1:nrow(refdf)){
      if(ddf[i,1]>refdf[j,1] &&  ddf[i,1]<refdf[j,2])
           {outdf[nrow(outdf)+1,] = ddf[i,]; next}
}
outdf
#  POS Freq1 Freq2
#2  48   0.7  0.55
#3   5   0.8  0.65

我嘗試了以下操作,但不起作用:

apply(ddf,1,function(x){print(x);ifelse(x[1]>refdf$Start & x[1]<refdf$End, x,"")})

對於大問題,這在空間上並不是特別有效,但不適for

ddf[ddf$POS %in% unlist(apply(refdf, 1, function(x) seq(x[1],x[2]))),]
##   POS Freq1 Freq2
## 2  48   0.7  0.55
## 3   5   0.8  0.65

POS所有允許值均由unlist(apply)表達式計算。 當然,這假定POS僅包含整數值。

這是一種方法。 它不需要整數值,但也不會特別有效:

pow <- cbind(expand.grid(ddf$POS, refdf$Start), Var3=expand.grid(ddf$POS, refdf$End)$Var2)

boom <- pow[which(pow$Var1 > pow$Var2 & pow$Var1 < pow$Var3), 'Var1']

ddf[ddf$POS %in% boom, ]
#  POS Freq1 Freq2
#2  48   0.7  0.55
#3   5   0.8  0.65

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM