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))
我正在尝试将 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))