如何根据包含的字符串的一部分选择列,然后在 R 中删除部分列名? (列位置可能不同)

Posted

技术标签:

【中文标题】如何根据包含的字符串的一部分选择列,然后在 R 中删除部分列名? (列位置可能不同)【英文标题】:How to select a column based on part of a contained string and then drop part of the column name in R? (Column position may vary) 【发布时间】:2022-01-13 22:22:58 【问题描述】:

我正在编写一个函数来准备 R 中的数据框,以便稍后在回归中使用。我想重命名包含单词距离的任何列。具体来说,我想删除距离之前的第一个描述性词。 (因此这将包括单词距离开始之前的单词和句点)。

我有:

country.distance.median country.distance.mean population  life.q state.distance.mean
                210                   189      10000        0.6.    100
                3100                  2100     20000        0.7.    300
                37                    36        500         0.3     10 

我想要:

             distance.median distance.mean population   life.q  distance.mean
                210                   189      10000      0.6     100
                3100                  2100     20000      0.7     300
                37                    36        500       0.3     10

因为这将包含在一个函数中,列的数量和位置是可变的,所以我需要一个不依赖于列位置的解决方案。请注意,它应该更改列名“life.q”,因此解决方案需要同样能够根据距离字符串识别和选择列。请注意,距离前面的单词也可能会发生变化(例如,列“state.distance.mean”)。

(它还应该能够在函数中用作 if 语句。)

感谢您的时间和想法。 :)

【问题讨论】:

【参考方案1】:

您可以在这里尝试使用sub

names(df) <- sub("^country\\.(?=distance\\.)", "", names(df), perl=TRUE)
df

  distance.median distance.mean population life.q
1             210           189      10000    0.6
2            3100          2100      20000    0.7
3              37            36        500    0.3

更一般地说,要删除第一个以点开头的单词,前提是单词后面还有另一个点,您可以尝试:

names(df) <- sub("^[^.]+\\.(?=.*\\.)", "", names(df), perl=TRUE)

【讨论】:

谢谢!我对正则表达式非常陌生,想知道如何重写它,以便第一个句点和第一个句点本身之前的任何单词都不会被替换? (我已编辑问题以反映此要求) @ksweet 我在我原来的答案下面给了你一个替代答案,可能适合你的需要。 完美,谢谢。

以上是关于如何根据包含的字符串的一部分选择列,然后在 R 中删除部分列名? (列位置可能不同)的主要内容,如果未能解决你的问题,请参考以下文章

R问题-如何在多列中选择包含某些字符串的多行?

根据用户的输入创建列联表 - R Shiny

根据向量中的 *not* 选择 R 数据框中的列

在 R 中,如何使用各种条件将数字列变为一个新列?

如何根据部分匹配选择 DataFrame 列?

如何从包含字符的列创建列分组信息