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

在特定条件下从数据帧中提取行

司知
2023-03-14

我必须根据特定条件过滤数据帧。如果解决方案考虑使用dplyr,效果更好。

我有这样的数据帧结构

  sentId.   B.   label.   partner. code
    1.      2.     3.       4.      123
    1.      2.     2.       4.      124
    4.      2.     3.       8.      125
    7.      3.     2.       7.      126

如果列标签包含特定值(例如,3.),不仅要收集该行,还要收集与前一行具有相同sentID和partner值的所有行。

预期结果如下:

  sentId.   B.   label.   partner. code
    1.      2.     3.       4.      123
    1.      2.     2.       4.      124
    4.      2.     3.       8.      125

共有3个答案

曹建明
2023-03-14

使用SQL可以很容易地解决这个问题,因此一个选项是使用sqldf库:

library(sqldf)

# your data frame df
sql <- "SELECT t1.\"sentId.\", t1.\"B.\", t1.\"label.\", t1.\"partner.\", t1.code
        FROM yourTable t1
        WHERE t1.\"label.\" = '3.' OR
            EXISTS (SELECT 1 FROM yourTable t2
                    WHERE t1.\"sentId.\" = t2.\"sentId.\" AND
                          t1.\"partner.\" = t2.\"partner.\" AND
                          t2.\"label.\" = '3.')"

result <- sqldf(sql)

注意:上面的演示实际上使用了MariaDB,因为SQLite没有使用演示工具。但它仍然表明查询逻辑是正确的。

司空浩邈
2023-03-14

我们可以首先找到我们感兴趣的标签值所在的行索引,然后使用这些索引对整个数据帧中的sentIdpartner值进行子集。

label_value <- 3
inds <- df$label == label_value
df[with(df, sentId %in% sentId[inds] & partner %in% partner[inds]), ]

#  sentId B label partner code
#1      1 2     3       4  123
#2      1 2     2       4  124
#3      4 2     3       8  125

dplyr中的相同逻辑是

library(dplyr)

df %>%
  filter(sentId %in% sentId[label == label_value] & 
         partner %in% partner[label == label_value])
卢皓轩
2023-03-14

我们可以使用%中的%对按“sentId”分组后的行进行筛选和“合伙人”

library(dplyr)
df1 %>%
  group_by(sentId., partner.) %>%
  filter(3 %in% label.)
# A tibble: 3 x 5
# Groups:   sentId. [2]
#  sentId.    B. label. partner.  code
#    <dbl> <dbl>  <dbl>    <dbl> <int>
#1       1     2      3        4   123
#2       1     2      2        4   124
#3       4     2      3        8   125

或以紧凑的方式与data.table

library(data.table)
setDT(df1)[, .SD[3 %in% label.], .(sentId., partner.)]

或使用base R

df1[with(df1, ave(label.==3, sentId., partner., FUN = any)),]
df1 <- structure(list(sentId. = c(1, 1, 4, 7), B. = c(2, 2, 2, 3), label. = c(3, 
 2, 3, 2), partner. = c(4, 4, 8, 7), code = 123:126),
 class = "data.frame", row.names = c(NA, 
 -4L))

 类似资料:
  • 在scala火花数据帧中是否有的替代方案。我想从火花数据帧的列中选择特定的行。例如,在R等效代码中的第100行

  • 我有一个包含以下列名的dataframe(对于引用,我只提到了一行)。我希望获得中的最大size_cd。在本例中,具有最大值,即24。我想将列名称中的数字作为返回值返回。 输入数据帧: 必需输出:即后面的部分(因为此列具有最大值) 我将感谢您对此的反馈。

  • 问题内容: 我有一个包含6列的R数据框,并且我想创建一个仅包含三列的新数据框。 假设我的数据帧df,我想提列A,B和E,这是唯一的命令,我可以计算出: 有没有更紧凑的方法可以做到这一点? 问题答案: 如果您的data.frame被调用,则使用dplyr包df1: 也可以在不使用%>%管道的情况下将其写为:

  • 对于熊猫数据帧的特定列,该列实际上是转换成BCD的16位数据。我只想提取特定行的14-8位并转换为BCD。下面的公式适用于如下的小数据帧。 但当我申请时 对于688126行的较大数据帧,我得到一个错误,说 基数为2的int()的文本无效:“” 错误如下所示 ValueError Traceback(最近调用最后一次)在1 df.LO_TIME_0_J2_0---- C:\ProgramData\A

  • 我有一个数据框,比如说一些投资数据。我需要根据某些条件(比如说,U类型)从这个数据帧中提取数据。有许多可用的基金类型,我只需要提取与特定基金类型匹配的数据。 funding_type有风险、种子、天使、股权等价值。我只需要数据匹配资金类型比如种子和天使 我试着跟着 这里MF1是我的数据帧。这将提供与种子基金类型相关的所有数据 我需要的条件有点像 MF1[MF1['funding_round_typ

  • 我有一个如下所示的数据帧: 我需要提取lat=30.75和lon 76.25的行,对于我使用的行: 但这表明了这个错误: