【问题标题】:Delete column if colname can't be found in another column如果在另一列中找不到 colname,则删除列
【发布时间】:2020-11-25 14:34:59
【问题描述】:

我有一个类似于下面的数据框。

set.seed(12)

size <- sample(100:1000, 7)
var <- c("V3", "V4", "V5", "V6", "V7", "V8", "V9")
dist <- matrix(runif(100), nrow = 7, ncol = 7)
diag(dist) <- 0

df <- as.data.frame(cbind(var, size, dist))

这导致数据集如下所示:

  var size                  V3                V4                 V5                V6                V7                 V8                V9
1  V3  549                   0 0.264918377622962  0.787836347473785 0.439429325051606 0.941087544662878   0.97763589094393 0.774718186818063
2  V4  445  0.0228777434676886                 0 0.0978530396241695 0.669819295872003 0.693911424372345  0.197649595327675 0.394586439244449
3  V5  435 0.00832482660189271 0.457607151241973                  0 0.240883231163025 0.843702238984406  0.844225987326354 0.361513090785593
4  V6  346   0.392697197152302 0.540707547217607  0.217823043232784                 0 0.384644460165873 0.0950279189273715 0.421090044546872
5  V7  958   0.813880559289828 0.665679829893634  0.267943592974916 0.882756386883557                 0  0.381151003297418 0.322011524345726
6  V8  273    0.37624845537357 0.112698937533423  0.504767951788381 0.814063254510984  0.58848182996735                  0 0.552160830702633

我想删除在变量var 中找不到列名的列(在本例中是名称为V9 的列)。我还想保留前两列,varsize。这导致数据集如下所示:

  var size                  V3                V4                 V5                V6                V7                 V8
1  V3  549                   0 0.264918377622962  0.787836347473785 0.439429325051606 0.941087544662878   0.97763589094393 
2  V4  445  0.0228777434676886                 0 0.0978530396241695 0.669819295872003 0.693911424372345  0.197649595327675 
3  V5  435 0.00832482660189271 0.457607151241973                  0 0.240883231163025 0.843702238984406  0.844225987326354 
4  V6  346   0.392697197152302 0.540707547217607  0.217823043232784                 0 0.384644460165873 0.0950279189273715 
5  V7  958   0.813880559289828 0.665679829893634  0.267943592974916 0.882756386883557                 0  0.381151003297418 
6  V8  273    0.37624845537357 0.112698937533423  0.504767951788381 0.814063254510984  0.58848182996735                  0 

【问题讨论】:

  • 前两列其实var中也没有提到。
  • 感谢您了解这一点,当然,我想保留前两列! :)
  • 当我运行代码时,我没有得到您发布的第一个数据帧。对我来说,它返回一个 7x9 数据框。你能仔细检查一下吗?

标签: r tidyverse data-manipulation


【解决方案1】:

使用%in% 查找要保留的变量,然后手动将前两个值替换为TRUE

col.keep <- colnames(df) %in% df$var
col.keep[1:2] <- TRUE
df2 <- df[col.keep]

如果不知道df$vardf$size的位置,手动绑定进去。

col.keep <- colnames(df) %in% df$var
df3 <- cbind(df$var, df$size, df[col.keep])

【讨论】:

  • 如果您使用的是tidyverse,您可以使用bind_cols() 而不是cbind()。稍微快一点,更安全。
  • 为什么不只是df[names(df) %in% c("var", "size", df$var)]
  • 我认为你必须取消 df$varc() 做一些时髦的事情。
  • df2 &lt;- df[names(df) %in% c("var", "size", as.character(df$var))] 有效!
【解决方案2】:

查看pivot_longer 并将列 V* 带入行。然后,您可以过滤这些列并返回。

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 2021-04-21
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2020-11-01
    • 2022-10-14
    相关资源
    最近更新 更多