初学者在这里!我有一个超过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]]))
}