如何将相同的操作应用于R中数据框架中分布的多列?



初学者在这里!我有一个超过600列的数据框架。我想对特定的列应用一些简单的操作,这些列都有相似的命名(参见下面的示例),但分布在整个数据框架中。如何根据列的名称和列名末尾的升序数字为所有这些列构建循环?

Dataframe例子:

Name  Col_x_1  Company  Col_x_2  Start_Year  End_Year  Col_x_3
asd   4 Col    Test     2 Col    1902        1933      1 Col
kfj   5 Cols   Test_2   10 Col   1933        1954      0
ale   0        Test_3   11 Cols  1988        1999      5 Col
...

输出示例:我想删除"Col_x_1, Col_x_2,…"列中值后面的空格后面的字符串。(直到56)并将列转换为dbl.

Name  Col_x_1  Company  Col_x_2  Start_Year  End_Year  Col_x_3
asd   4        Test     2        1902        1933      1 
kfj   5        Test_2   10       1933        1954      0
ale   0        Test_3   11       1988        1999      5 
...

如何构建一个循环来执行这个简单的操作?提前感谢!

您可以使用tidyverse:

library(tidyverse)
df %>% 
mutate(across(starts_with("Col_x"), ~str_extract(., "^\d+") %>% as.numeric()))

这返回

# A tibble: 3 × 7
Name  Col_x_1 Company Col_x_2 Start_Year End_Year Col_x_3
<chr>   <dbl> <chr>     <dbl>      <dbl>    <dbl>   <dbl>
1 asd         4 Test          2       1902     1933       1
2 kfj         5 Test_2       10       1933     1954       0
3 ale         0 Test_3       11       1988     1999       5

或者,根据你的实际数据

df %>% 
mutate(across(starts_with("Col_x"), ~str_remove_all(., "(?<=\d)\s+[A-z]+") %>% as.numeric()))

第一个提取起始数字(假设它是整数)并删除剩余的内容。第二个查找后跟一个空格和一些字母的数字,并删除它们。

最后两者都将剩余部分转换为数字。

我们使用starts_with()按名称模式选择列。还有其他的可能,如ends_with(),matches()contains()。选择合适的函数取决于名称的实际结构。

如果必须使用循环,您可以使用grep来获取包含"Col_x_"在开头和gsub中删除您想要的单词

names_dat <- grep("^Col_x_",names(dat), value = TRUE)
for (i in names_dat) {
dat[[i]] <- as.numeric(gsub("Cols?","", dat[[i]]))
}

最新更新