已获取多列字符串长度,如何计算每行的长度差值?
计算每行字符串长度的差值
现有代码与需求
用户已通过以下代码计算出数据框中x、y、z列的字符串长度:
data = tibble(x = c("a", "b"), y = c("aa", "b"), z = c("a", "bb")) data %>% mutate(str_length = across(c(x, y, z), ~ str_count(., ".")))
现在需要计算每行中这些字符串长度的差值,期望得到data$str_diff = c(1, 1)。
实现方案
方案一:无需单独存储长度列,一步计算
可以跳过单独生成长度列的步骤,直接在管道中计算每行长度的极差(最大值减最小值):
library(tidyverse) data = tibble(x = c("a", "b"), y = c("aa", "b"), z = c("a", "bb")) data %>% mutate( str_diff = pmap_dbl(across(x:z), ~ { lengths = str_count(c(...), ".") max(lengths) - min(lengths) }) )
方案二:基于已生成的str_length列计算
如果已经保留了嵌套的str_length列,先将其展开为单独列,再计算差值:
data %>% mutate(str_length = across(c(x, y, z), ~ str_count(., "."))) %>% unnest_wider(str_length) %>% mutate(str_diff = pmax(x, y, z) - pmin(x, y, z))
方案三:用rowwise()简化行处理
借助rowwise()按行处理,结合c_across()获取每行的目标列值:
data %>% rowwise() %>% mutate( str_diff = max(str_count(c_across(x:z), ".")) - min(str_count(c_across(x:z), ".")) ) %>% ungroup()
以上三种方案最终都会生成str_diff列,其值为c(1, 1),满足需求。
内容的提问来源于stack exchange,提问作者pgitti
相关产品推荐
相关产品推荐

