【问题标题】:Rename_if column in R with prefix if name %in% list: lists do not match如果名称 %in% 列表,则 R 中的 Rename_if 列带有前缀:列表不匹配
【发布时间】:2020-12-14 11:06:51
【问题描述】:

我有一个用map 函数创建的小标题列表。列名如下...

dfA[[1]]%>% colnames(.)  
[1] "date_strt"  "grouped_id" "10938_0"    "12881_0"   

编号的列名称会为我正在使用的函数(鼠标)产生问题,我需要将它们更改为在开头添加一个字符串前缀。由于我需要为 大量的小标题 执行此操作,因此我无法直接引用这些名称。所以我从另一个 tibbles names

创建了字符向量列表
df_list <- dfB %>% names() %>% as.vector()

有些名称带有字符串“ITEM”前缀,因此我将其删除以用于匹配列表。

df_list <- purrr::map(df_list ,function(x){x %>% str_remove(.,"ITEM")})

当我尝试根据字符串进行追加时,我们会得到一些不需要的特殊字符

purrr::map2(dfA, df_list, function(df, name_list)
    df %>% rename_if(colnames(.) %in% name_list, ~paste0("ITEM", .)))

[[1]] date_strt           grouped_id `ITEM\`12881_0\`` `ITEM\`79916_0\``

然后我使用list 将名称列表 (df_list) 转换为列表,因为有人告诉我这是一个问题。

df_list<- list(df_list)

这在昨晚有效,但是由于某种原因在今天重新启动我的会话(并更新我的包)后它不再有效。

当我对行名进行条件检查时

dfA[[1]][-1]%>% colnames(.) == df_list[[1]]

我在申请list之前得到了这个

[1] FALSE  TRUE  TRUE

但这之后

[1] FALSE FALSE FALSE

我不知道为什么,但 df_list[[1]] 现在返回两个列表时间,而不仅仅是列表 [1]

之前申请list

[1] "day"     "10938_0" "12881_0"

之后申请list

[[1]]
[1] "day"     "10938_0" "12881_0"

[[2]]
[1] "day"     "12881_0" "79916_0"

关于为什么以及如何解决它的任何建议?或者,它只有以数字开头的列,我也需要附加前缀,但我看不到明显的解决方案。

【问题讨论】:

    标签: r dplyr tidyverse tidyr data-wrangling


    【解决方案1】:

    这里str_remove 应用于整个数据集,根据?str_remove 输入string 将是

    string - 输入向量。要么是字符向量,要么是可以强制转换的东西

    data.frame/tibble 不能强制转换为vector

    这可以用一个简单的例子来重现

    head(iris) %>% 
         str_remove("\\..*")
    #[1] "c(5"                 "c(3"                 "c(1"                 "c(0"                 "c(1, 1, 1, 1, 1, 1)"
    

    相反,它应该应用于每一列

    library(dplyr)
    library(purrr)
    library(stringr)
    purrr::map(df_list, ~ .x %>%
                              rename_all(~ str_remove(.,"ITEM")))
    

    【讨论】:

    • 这是有道理的,我会选择它作为答案,但是当我使用此代码代替上面的删除函数时,我得到这个: UseMethod("tbl_vars") 中的错误:没有适用的方法'tbl_vars' 应用于“字符”类的对象。这是因为列表实际上不是按列名排列的表吗?
    • @Comte 是否有任何不是 data.frame 或 tibble 的列表元素,即这里我们假设列表元素都是 data.frame/tibble。如果不是,那么rename_all 可能会失败
    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2022-06-12
    • 2017-08-24
    相关资源
    最近更新 更多