modify_if :将谓词函数应用于数据框

modify_if : apply predicate function to a dataframe

我正在尝试将 modify_if 函数应用于具有字符值的数据框:

> dataframe
  col_1   col_2   col_3
  <chr>   <chr>   <chr>                 
 1 840    1097    989            
 2 s      s       s            
 3 781    9021    9006          

我想在字符列中插入千位分隔符以获得以下结果:

> expected_dataframe
  col_1   col_2   col_3
  <chr>   <chr>   <chr>                 
 1 840    1 097    989            
 2 s      s        s            
 3 781    9 021    9 006          

我不知道如何调用谓词函数中的单元格。我尝试使用 nchar 函数,但遇到以下错误:

> modify_if(dataframe, ~ nchar(.x) >3 , ~ stri_sub( ., nchar() - 3, nchar() - 2) <- " " )
Error: Predicate functions must return a single `TRUE` or `FALSE`, not a logical vector of length 102

基数 R:

> as.data.frame(t(apply(dataframe, 1, function(x) sapply(x, function(y) if(!is.na(as.numeric(y))) format(as.numeric(y), big.mark=' ') else y))))
  col_1 col_2 col_3
1   840 1 097   989
2     s     s     s
3   781 9 021 9 006

modify_if 允许选择 要改变的列 ,它不会过滤行。事实上,你最好在这里使用 table 函数(即 mutate),而不是“purrr”动词。

相反,您的变异函数本身必须测试每个给定值是否超过 3 个字符。格式化的逻辑也比简单地在三个字符后添加一个空格要复杂得多;所以我将使用 format 提供的现有实现,而不是自己动手:

add_thousands_sep = function (x) {
    num = suppressWarnings(as.numeric(x))
    result = ifelse(is.na(num), x, format(num, big.mark = ' ', scientific = FALSE))
}

mutate(dataframe, across(everything(), add_thousands_sep))