当前位置: 首页 > 知识库问答 >
问题:

R: 查找数据帧列中大于或等于其他数据帧列的行值的最小值

田镜
2023-03-14

第一次问问题(温柔点),因为我还没有找到任何有用的东西。

在R中,我有两个数据帧。一个(DataFrameA)有一列带有唯一日期列表。另一个(DataFrameB)也有日期列表。但是DataFrameB中的某些日期在DataFrameA中可能不存在。在这种情况下,我想将DataFrameB中的日期更新为DataFrameA中的最小日期,该日期大于DataFrameB中的日期。

在SQL中,我可能会这样做:

Select MyDate as OldDate, 
(select min(MyDate) from DataFrameA where MyDate >= B.MyDate) as NewDate 
from DataFrameB as B

我的目标是用DataFrameA中的正确值更新DataFrameB的每一行中的MyDate列。

因此,如果数据帧 B 以

2019-01-01
2019-01-02
2019-01-03
2019-01-04
2019-01-05

而DataFrameA只有

2019-01-01
2019-01-03
2019-01-05

DataFrameB最终会看起来像

2019-01-01
2019-01-03
2019-01-03
2019-01-05
2019-01-05

提前感谢。

共有3个答案

王云
2023-03-14

我会使用简单的数据帧操作:

#prepare the data frames:
a <- data.frame(as.Date("2019-01-01") + 0:4)
b <- data.frame(c(a[1],a[3],a[5]))

#filter the a based on b
for (i in 1:nrow(a)) {
  pos <- min(which(b[,1] >= a[i,1]))
  a[i,1] <- b[pos,1] 

}
#done
print(a)
锺离烈
2023-03-14

OP直接提出的SQL解决方案可以在R中使用< code>sqldf包实现:

library(sqldf)
sqldf("Select MyDate as OldDate, 
(select min(MyDate) from DataFrameA where MyDate >= B.MyDate) as NewDate 
from DataFrameB as B")
     OldDate    NewDate
1 2019-01-01 2019-01-01
2 2019-01-02 2019-01-03
3 2019-01-03 2019-01-03
4 2019-01-04 2019-01-05
5 2019-01-05 2019-01-05

请注意,<code>MyDate</code>是OP在注释中提到的字符日期(实际上,它们是<code>factor</code>类型,因为<code>data.frame()</code>默认情况下将字符串转换为factor。)

DataFrameB <- data.frame(MyDate = as.character(as.Date("2019-01-01") + 0:4))
DataFrameA <- DataFrameB[c(TRUE, FALSE), , drop = FALSE]
云和硕
2023-03-14

我们可以使用非Equi连接与data.table

library(data.table)
dates <- setDT(dfA)[dfB, min(date),on = .(date >= date), 
             allow.cartesian = TRUE, by = .EACHI]$V1
dfB$date <- dates
dfB
#         date
#1: 2019-01-01
#2: 2019-01-03
#3: 2019-01-03
#4: 2019-01-05
#5: 2019-01-05

或者使用findIntervalfrombase R

dfA$date[findInterval(dfB$date, dfA$date, left.open = TRUE) + 1]
#[1] "2019-01-01" "2019-01-03" "2019-01-03" "2019-01-05" "2019-01-05"
dfB <- structure(list(date = structure(c(17897, 17898, 17899, 17900, 
17901), class = "Date")), row.names = c(NA, -5L), class = "data.frame")

dfA <- structure(list(date = structure(c(17897, 17899, 17901), 
         class = "Date")), row.names = c(NA, 
-3L), class = "data.frame")
 类似资料:
  • 我有两个熊猫数据框 步骤2:对于flag=1的行,AA_new将计算为var1(来自df2)*组“A”和val“AA”的df1的'cal1'值*组“A”和val“AA”的df1的'cal2'值,类似地,AB_new将计算为var1(来自df2)*组“A”和val“AB”的df1的'cal1'值*组“A”和val“AB”的df1的'cal2'值 我的预期输出如下所示: 以下基于其他stackflow

  • 我有这样一个数据帧: 我如何摆脱第四行,因为它有sq_resid的最大值?注意:最大值将从一个数据集更改到另一个数据集,所以仅仅删除第4行是不够的。 我已经尝试了一些方法,比如我可以删除像下面这样留下数据帧的最大值,但是无法删除整行。

  • 本文向大家介绍如何确定R数据帧列中具有最小值和最大值的行?,包括了如何确定R数据帧列中具有最小值和最大值的行?的使用技巧和注意事项,需要的朋友参考一下 在数据分析中,我们经常需要确定最小值和最大值,因为这些值有助于我们理解所考虑的列或变量的限制。可以通过在单个方括号中使用which.max表示最大值,并使用which.min表示最小值来提取行。 示例 请看以下数据帧- 输出结果 确定具有特定列的最

  • 本文向大家介绍如何在R数据帧的列中查找唯一值?,包括了如何在R数据帧的列中查找唯一值?的使用技巧和注意事项,需要的朋友参考一下 分类变量具有多个类别,但是如果数据集很大且类别也很大,那么识别它们就会有些困难。因此,我们可以为分类变量提取唯一值,这将有助于我们轻松识别分类变量的类别。我们可以通过对R数据帧的每一列使用唯一的方法来做到这一点。 示例 请看以下数据帧- 在列x1中找到唯一值- 在列x2中

  • 本文向大家介绍如何基于R数据帧列的值获取行索引?,包括了如何基于R数据帧列的值获取行索引?的使用技巧和注意事项,需要的朋友参考一下 R数据帧的一行可以在列中具有多种方式,并且这些值可以是数字,逻辑,字符串等。基于行号查找值很容易,但是基于值查找行号却很不同。如果要在特定列中查找特定值的行号,则可以提取整行,这似乎是一种更好的方法,可以使用单个方括号来获取行的子集。 示例 请看以下数据帧- 输出结果

  • 我有一个pandas dataframe,需要根据dataframe中其他列的值创建新列。这是数据帧 人城市国家国家 美国伊利诺伊州芝加哥 美国亚利桑那州凤凰城B酒店 C美国加利福尼亚州圣地亚哥 我想根据state中的值创建两个新列 创建新列df[“城北”]=df[“城市”]其中state=“伊利诺伊” 创建新列df[“城市南部”]=df[“城市”],其中州不等于“伊利诺伊州” 我试过了 但是不等