簡體   English   中英

對於數據框中的每一行,遍歷另一個數據框

[英]For each row in a dataframe, loop through another dataframe

我需要遍歷一個數據幀,讀取三列的值(2個時間戳和1個標簽)。 然后,對於這三個值的行,我需要與第二個數據幀的每一行進行比較,以查看A)標簽是否匹配,以及B)第二個數據幀中的時間戳是否在當前行的兩個時間戳之間。 如果該行確實符合這兩個條件,則應將其保存到數據幀/向量中以進行進一步處理。

我嘗試了x_apply函數的許多版本,並結合了for循環(用於“第二次”迭代)。 下面是我的問題的非常簡化的版本,其中我創建了兩個小數據框並嘗試建立所需的循環。 該值應保存為'x'-雖然在循環中我打印(x)時會顯示該值,但在apply函數完成后,'x'被聲明為NULL。 似乎在每次調用該函數時也會將其重置。 考慮到我的要求,您對其他/更好的方法有想法嗎? 我不需要使用apply本身。 提前非常感謝您!

label <- c("p1", "p1", "p2")
value_1 <- c(8,4,2)
value_2 <- c(10,6,9)
df1 <- data.frame(label, value_1, value_2)

label <- c("p1", "p2", "p2")
value_3 <- c(8,8,8)
df2 <- data.frame(label, value_3)

x = NULL

small_function <- function(value_1, value_2, label) {
  for(i in 1:nrow(df2[df2$label == label,])) {
    print(i)
    x <- append(x, i)
    print(x)
  }
}

apply(df1, 1, function(x,y,z) small_function(df1$value_1, df1$value_2, df1$label))
x

更新:一個帶有日期的示例,對我來說導致錯誤“期望單個值”。

label <- c("p1", "p1", "p2")
value_1 <- c(as.POSIXct(1482645600, origin="1970-01-01"),as.POSIXct(1482745600, origin="1970-01-01"),as.POSIXct(1482845600, origin="1970-01-01"))
value_2 <- c(as.POSIXct(1582645600, origin="1970-01-01"),as.POSIXct(1582745600, origin="1970-01-01"),as.POSIXct(1582845600, origin="1970-01-01"))
df1 <- data.frame(label, value_1, value_2)
label <- c("p1", "p2", "p2")
value_3 <- c(as.POSIXct(1582645100, origin="1970-01-01"),as.POSIXct(1582745200, origin="1970-01-01"),as.POSIXct(1582845300, origin="1970-01-01"))
df2 <- data.frame(label, value_3)

df_merge = merge(df1, df2, c("label"), suffixes = c(".df1",".df2"))
setDT(df_merge)
str(df_merge)
a <- df_merge[between(value_3, value_1, value_2), ]

這是你想要的?

library(data.table)
setDT(df1)
setDT(df2)    
setkey(df1, label)
setkey(df2, label)
df1[df2]  # here i merge both the data.table

df3[between(value_3, value_1, value_2), ]  # apply the condition
#   label value_1 value_2 value_3
#1:    p1       8      10       8
#2:    p2       2       9       8
#3:    p2       2       9       8

數據中有一些日期:

# ensure the dates are in proper formats( i had simulated some sample data with dates. just sharing the last 2 steps output)
df3$value_1 = as.Date(df3$value_1, format= "%d/%m/%Y")
df3$value_2 = as.Date(df3$value_2, format= "%d/%m/%Y")
df3$value_3 = as.Date(df3$value_3, format= "%d/%m/%Y")
# df3
#   label    value_1    value_2    value_3
#1:    p1 2016-03-10 2016-03-20 2016-03-15
#2:    p1 2016-06-17 2016-06-19 2016-03-15
#3:    p2 2016-09-10 2016-09-20 2016-06-21
#4:    p2 2016-09-10 2016-09-20 2016-09-12

df3[between(value_3, value_1, value_2), ]
#   label    value_1    value_2    value_3
#1:    p1 2016-03-10 2016-03-20 2016-03-15
#2:    p2 2016-09-10 2016-09-20 2016-09-12

如果您要尋找的是基R,這是一個很短的解決方案:

dfr <- merge(df1, df2, by="label", all=FALSE)
subset(dfr, value_3 > value_1 & value_3 < value_2)

暫無
暫無

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

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