【问题标题】:Logical operators in a Data.Frame in RR中Data.Frame中的逻辑运算符
【发布时间】:2026-02-23 17:50:02
【问题描述】:

这是我的数据框:

    x<-structure(list(ABEV3 = c(1, -0.0329694340790399, -0.600795689797522, 
-0.300219759273298), AZUL4 = c(-0.0329694340790399, 1, 0.531987810491871, 
0.884036954118666), BTOW3 = c(-0.600795689797522, 0.531987810491871, 
1, 0.612824308045668), B3SA3 = c(-0.300219759273298, 0.884036954118666, 
0.612824308045668, 1)), row.names = c("ABEV3", "AZUL4", "BTOW3", 
"B3SA3"), class = "data.frame")

我想删除所有符合此条件的值:如果 x[i,j] 大于 0.85 且小于 0.99,它将保留在我的数据框中(保留行和列名):

所以我这样做了:

y<- x>0.35 & x<0.99

但是当我运行时:x[y] 它不是数据框。而且它不保留列/行名称。

如何使用相同的步骤更正此问题?即,使用逻辑矩阵 y ?

我的最终输出应该是这个:

out<-structure(c(0.5319878, 0.884037, 0.53198781, 0.88403695, 0.6128243, 
0.5319878), .Dim = 3:2, .Dimnames = list(c("AZUL4", "BTOW3", 
"B3SA3"), c("BTOW3", "B3SA3")))

PS:这个想法只是从我的 x data.frame 中删除与x&gt;0.85 &amp; x&lt;0.99 标准不匹配的值。

【问题讨论】:

  • y 是一个和你的框架一样大的矩阵。当您说“删除所有值”时,您的意思是“将它们替换为NA,还是在R中无法完成的操作“使框架中的那些单元格完全为空” 。 (从技术上讲,您可以将所有列转换为列表列,以便允许 NULL,但它会破坏很多东西并且难以使用。)
  • 了解您的预期输出是很有用的。 编辑:试试x[!y] &lt;- NA
  • 伙计们,我将编辑问题。
  • @Laura then: x[!y]
  • 您想要一个基本解决方案,在 cmets 和答案中得到一个单行,然后接受非基本解决方案?奇怪,*耸耸肩*。

标签: r logical-operators


【解决方案1】:

您不能只删除值而不删除整行或整列。我想你想要这个 -

x[x > 0.85 & x < 0.99] <- NA_real_

            ABEV3       AZUL4       BTOW3      B3SA3      BRSR6      BBSE3        BRML3      BBDC3      BBDC4        BRAP4
ABEV3  1.00000000 -0.03296943 -0.60079569 -0.3002198 -0.3971484 -0.1111854 -0.201374719 -0.1459591 -0.2943246 -0.048831117
AZUL4 -0.03296943  1.00000000  0.53198781         NA         NA         NA  0.830385751         NA         NA  0.214403356
BTOW3 -0.60079569  0.53198781  1.00000000  0.6128243  0.8196140  0.4432318  0.560694380  0.6530405  0.7307261  0.064940995
B3SA3 -0.30021976          NA  0.61282431  1.0000000         NA         NA  0.820488340         NA         NA  0.184650344
BRSR6 -0.39714843          NA  0.81961398         NA  1.0000000  0.7963561  0.781602231         NA         NA  0.140952812
BBSE3 -0.11118541          NA  0.44323184         NA  0.7963561  1.0000000           NA         NA         NA  0.136343833
BRML3 -0.20137472  0.83038575  0.56069438  0.8204883  0.7816022         NA  1.000000000         NA         NA  0.009409914
BBDC3 -0.14595908          NA  0.65304052         NA         NA         NA           NA  1.0000000         NA  0.116203752
BBDC4 -0.29432460          NA  0.73072606         NA         NA         NA           NA         NA  1.0000000  0.126570544
BRAP4 -0.04883112  0.21440336  0.06494099  0.1846503  0.1409528  0.1363438  0.009409914  0.1162038  0.1265705  1.000000000

【讨论】:

  • 现在我怎样才能有一个“干净”的 data.frame 删除 NA 值?
  • @Laura 删除 NA 值是什么意思?您必须删除包含NA 的整行或整列。
  • 位置 [4,2] 这对我来说并不有趣。我想删除。然后我会有一个小的 data.frame。
  • @Laura 在这种情况下,您必须完全删除第 4 行或第 2 列。不能只删除单个值。如果你愿意,你可以在分析中忽略NA
【解决方案2】:

您可以使用dplyr...尝试这种方法。

x <- x %>% mutate(r=rownames(.)) %>% gather(k,v,-r,factor_key = T) %>% 
  filter(v>0.85 & v<0.99) %>% spread(k,v)
rownames(x) <- x$r
x <- x %>% select(-r)
x

          AZUL4     B3SA3     BRSR6     BBSE3     BRML3     BBDC3     BBDC4
AZUL4        NA 0.8840370 0.8608257 0.8861292        NA 0.9185312 0.8885266
B3SA3 0.8840370        NA 0.9109177 0.9144024        NA 0.9193643 0.9450005
BBDC3 0.9185312 0.9193643 0.9171293 0.9163145 0.9043771        NA 0.9844133
BBDC4 0.8885266 0.9450005 0.9571348 0.8981849 0.8848416 0.9844133        NA
BBSE3 0.8861292 0.9144024        NA        NA 0.8980725 0.9163145 0.8981849
BRML3        NA        NA        NA 0.8980725        NA 0.9043771 0.8848416
BRSR6 0.8608257 0.9109177        NA        NA        NA 0.9171293 0.9571348

这是否提供了所需的输出?它将删除没有满足条件的值的列/行,即ABEV3被完全删除并且不返回。

【讨论】:

  • 我相信是的。但我的意图是使用 y 矩阵和 x 数据框之间的匹配。并继续使用 R 的基础包。