子集 df 仅保留行值与 X 匹配的列

问题描述 投票:0回答:2

我有一个由单行组成的 df 。要理解为什么我的数据帧只有一行,请继续阅读,如果没有,请跳到 TLDR;。

背景 这是一个更大的聚类项目的一部分,我用它来帮助我了解数据集中每周发生的变化。我对数据进行了操作,使每一列都是一个二进制字段,指示该列中的数据自上次从系统中提取数据集以来是否发生了变化。

我已经运行了 k-medoids 聚类 (PAM),确定了集群的 medoids(中间代表观察),现在我正在检查它们。每个簇只有一个中心点(正如预期的那样),因此当我提取它们时,我最终看到的数据帧只是一行有 70 多列的数据帧。

中心点观测值代表其集群中的所有其他观测值,因此重要的是我可以提取集群 A 中的中心点与集群 B 中的中心点不同的原因。但是,由于我有很多列,因此很难目视进行。

我想要做的是获取这 70 多个列并过滤它们,以便我只看到值从一周到下一周发生变化的列,也就是所有值为“Change”的列。

这看起来非常简单,就像我应该能够使用基本 R 或 dplyr 轻松完成的事情一样,但出于某种原因,我真的很难掌握语法,我感觉自己像个白痴。

TLDR;

我的示例数据是单行 df,看起来像这样。我只想要行值显示“更改”的列。

df<-data.frame(ID = 12345, 
               ORDER_STATUS = 'Change',
               ORDER_DATE = 'Change',
               PRODUCT = 'Same',
               CUSTOMER = 'Same',
               STATE = 'Same')

我尝试了很多事情,但最接近的似乎是这样的:

filtered_df <- df %>% filter(select(everything()) == 'Change')

或:

col_list <- colnames(df)

filter_df <- df %>% filter(if_any(all_of(col_list), ~. == 'Change'))

或使用基数 R:

filtered_df <- df[,df[1,1:6]=="Change"]

但是这些由于各种原因不起作用:(

我希望看到这样的东西:

> filtered_df

   ID         ORDER_STATUS ORDER_DATE 
1 12345       Change       Change    

或者甚至没有 ID 也可以,因为我会知道我正在查看哪个观察结果:

 ORDER_STATUS ORDER_DATE 
 Change       Change    

有什么想法吗?任何帮助将不胜感激。如果这是非常明显的事情,我会准备好捂脸。

编辑 根据评论,我被告知

filtered_df <- df[,df[1,1:6]=="Change"]
给出了正确的答案。当我用真实数据运行它时,我收到错误:

df[, df[1, 1:71] == "Change"]
中的错误: !无法使用
df[1, 1:71] == "Change"
对列进行子集化。 ✖ 下标
df[1, 1:71] == "Change"
必须是简单向量,而不是矩阵。 回溯:

  1. df[, df[1, 1:71] == “改变”]
  2. rlang::cnd_signal(x)
r dplyr filtering subset
2个回答
0
投票

从逻辑矩阵中提取时使用参数

drop = TRUE

df <- data.frame(ID = 12345, 
                 ORDER_STATUS = 'Change',
                 ORDER_DATE = 'Change',
                 PRODUCT = 'Same',
                 CUSTOMER = 'Same',
                 STATE = 'Same')
# returns a matrix
(df == "Change")
#>         ID ORDER_STATUS ORDER_DATE PRODUCT CUSTOMER STATE
#> [1,] FALSE         TRUE       TRUE   FALSE    FALSE FALSE

(df == "Change") |> class()
#> [1] "matrix" "array"

# returns a named logical vector
(df == "Change")[1, , drop = TRUE]
#>           ID ORDER_STATUS   ORDER_DATE      PRODUCT     CUSTOMER        STATE 
#>        FALSE         TRUE         TRUE        FALSE        FALSE        FALSE

(df == "Change")[1, , drop = TRUE] |> class()
#> [1] "logical"

# use the logical vector to subset the columns
df[, (df == "Change")[, , drop = TRUE]]
#>   ORDER_STATUS ORDER_DATE
#> 1       Change     Change

创建于 2023-08-11,使用 reprex v2.0.2


0
投票

经过@benson23的评论后,解决方案最终是我现实生活中的 df 是类“tbl_df”、“tbl”和“data.frame”。

我需要将其转换为数据框,并用我的真实数据执行以下操作:

df<-as.data.frame(df)

df[,df[1,1:ncol(df)]=="Change"]
© www.soinside.com 2019 - 2024. All rights reserved.