Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对于数据帧中的每一行,循环另一个数据帧_R_Apply - Fatal编程技术网

R 对于数据帧中的每一行,循环另一个数据帧

R 对于数据帧中的每一行,循环另一个数据帧,r,apply,R,Apply,我需要循环一个数据帧,读取三列的值(2个时间戳和1个标签)。然后,对于这三个值的行,我需要与第二个数据帧的每一行进行比较,以查看a)标签是否匹配,以及B)第二个数据帧中的时间戳是否在当前行的两个时间戳之间。如果该行确实符合这两个条件,则应将其保存到数据帧/向量以供进一步处理 我尝试了许多版本的x_apply函数,并结合for循环(用于“第二次”迭代)。下面是我的问题的一个非常简化的版本,我创建了两个小数据帧并尝试建立所需的循环。该值应保存到“x”-当我在循环中打印(x)时显示该值,但在应用函数完

我需要循环一个数据帧,读取三列的值(2个时间戳和1个标签)。然后,对于这三个值的行,我需要与第二个数据帧的每一行进行比较,以查看a)标签是否匹配,以及B)第二个数据帧中的时间戳是否在当前行的两个时间戳之间。如果该行确实符合这两个条件,则应将其保存到数据帧/向量以供进一步处理

我尝试了许多版本的x_apply函数,并结合for循环(用于“第二次”迭代)。下面是我的问题的一个非常简化的版本,我创建了两个小数据帧并尝试建立所需的循环。该值应保存到“x”-当我在循环中打印(x)时显示该值,但在应用函数完成后,“x”被声明为空。每次调用函数时,它似乎也会重置。考虑到我的要求,您是否有其他/更好方法的想法?我不需要使用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这就是你要找的吗

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

这就是你要找的吗

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

下面是base R中的一个非常简短的解决方案,如果这是您正在寻找的:

dfr <- merge(df1, df2, by="label", all=FALSE)
subset(dfr, value_3 > value_1 & value_3 < value_2)
dfr值\u 1和值\u 3
如果这正是您要寻找的,那么这里有一个非常简短的base R解决方案:

dfr <- merge(df1, df2, by="label", all=FALSE)
subset(dfr, value_3 > value_1 & value_3 < value_2)
dfr值\u 1和值\u 3
先合并,然后应用范围条件!首先合并,然后应用您的范围条件!这太棒了!然而,当我对POSIXct值使用between调用时,我确实会得到一个错误:“error:需要一个值”。知道我该如何解决这个问题吗?介意分享一个带有日期的样本数据吗?我会调查的这将是一个容易解决的问题。圣诞快乐…现在就去教堂谢谢你,也祝你圣诞快乐:)我编辑了我的第一个问题,其中包含了更多的样本数据。非常感谢您的帮助。@WalterB我检查了您的更新数据,它对我有效!完全没有错误!真奇怪!我只是重新运行了代码,但仍然出现了错误。。不知道出了什么问题。有什么好主意吗?这太棒了!然而,当我对POSIXct值使用between调用时,我确实会得到一个错误:“error:需要一个值”。知道我该如何解决这个问题吗?介意分享一个带有日期的样本数据吗?我会调查的这将是一个容易解决的问题。圣诞快乐…现在就去教堂谢谢你,也祝你圣诞快乐:)我编辑了我的第一个问题,其中包含了更多的样本数据。非常感谢您的帮助。@WalterB我检查了您的更新数据,它对我有效!完全没有错误!真奇怪!我只是重新运行了代码,但仍然出现了错误。。不知道出了什么问题。我能试试什么吗?