试图通过条件运算符隔离所有列(表示年份),并在R中重命名它们


library(readr)
d <- read.csv("per_capita.csv")
rc <- d[,-2:-3]

df <- data.frame(rc)
draw <- df$X1994[df$Country.Name == "India"]
format(draw, scientific = F, big.marks = ",")
library(dplyr)
df %>%
filter(Country.Name == "India") %>%
select(names(.)[-1][readr::parse_integer(names(.)[-1] > 1994])

我尝试了这个代码,它在最后一行给了我一个错误。此外,我应该如何在不使用数据帧的情况下重命名CSV文件中的这些列?

列名为:X1994、X1995…..等等。

谢谢!

如果您想选择数字大于值的列,可以这样做:

library(tidyverse)
#example
set.seed(24)
df <- tibble(country = rep(c("India", "Canada"), each = 3),
X1990 = runif(6),
X1991 = runif(6),
X1992 = runif(6))
df |>
filter(country == "India")  |>
select(!!!vars(colnames(df)[-1][which(parse_number(colnames(df)[-1]) > 1990)]))
#> # A tibble: 3 x 2
#>   X1991 X1992
#>   <dbl> <dbl>
#> 1 0.280 0.672
#> 2 0.764 0.673
#> 3 0.802 0.320

尽管这很复杂。可能最好是做多,过滤,然后做多:

df |>
filter(country == "India") |>
mutate(id = row_number()) |>
pivot_longer(contains("X")) |>
mutate(name = parse_number(name))|>
filter(name > 1990) |>
pivot_wider(names_from = name, values_from = value)|>
select(-c(id, country))
#> # A tibble: 3 x 2
#>   `1991` `1992`
#>    <dbl>  <dbl>
#> 1  0.280  0.672
#> 2  0.764  0.673
#> 3  0.802  0.320

我们可以看出,这个答案相当冗长和繁琐。也许我们坚持基地R:

cols <- which(as.numeric(sub("^.*?(\d+).*$", "\1", colnames(df)[-1])) > 1990) +1
rows <- df$country == "India"
df[rows,cols]
#> # A tibble: 3 x 2
#>   X1991 X1992
#>   <dbl> <dbl>
#> 1 0.280 0.672
#> 2 0.764 0.673
#> 3 0.802 0.320

或者实际上,如果我们只寻找值高于目标年份的字符串,也许我们可以使tidyverse版本更干净:

all_years <- 1990:1995
df |>
filter(country == "India") |>
select(contains(paste0("X", all_years[all_years > 1990])))
#> # A tibble: 3 x 2
#>   X1991 X1992
#>   <dbl> <dbl>
#> 1 0.280 0.672
#> 2 0.764 0.673
#> 3 0.802 0.320

使用相同的逻辑,我们也可以用基R:进行部分字符串匹配

all_years <- 1990:1995
cols <- grepl(paste(all_years[all_years>1990], collapse = "|"), colnames(df))
rows <- df$country == "India"
df[rows,cols]
#> # A tibble: 3 x 2
#>   X1991 X1992
#>   <dbl> <dbl>
#> 1 0.280 0.672
#> 2 0.764 0.673
#> 3 0.802 0.320

希望其中一个能帮助你,让你心动。无论你有什么心情,都有很多选择。

相关内容

最新更新