如何在R语言中映射列表并提取换行后的货币符号至新列?
解决R语言列表中提取货币符号创建新列的问题
我来帮你搞定这个提取货币符号的问题,先拆解下你之前代码的问题,再给你几个可行的解决方案:
你之前代码的问题点
str_extract(., "\n")里的第一个参数错了:应该指定具体的列financialVariable,而不是整个数据框.,这会直接导致报错- 正则表达式
"\n"只会匹配换行符本身,没法提取后面的货币符号 - 你的数据都是分组数据框(grouped_df),处理前最好先取消分组,避免后续操作出现意外
方案1:保留原列表结构,为每个数据框新增currency列
这个方案会维持你原有的列表格式,给每个公司的tibble都加上货币列:
library(purrr) library(dplyr) library(stringr) # 定义处理单个数据框的函数 process_single_df <- function(df) { df %>% ungroup() %>% # 先取消分组,避免分组带来的限制 mutate( # 用正向断言匹配换行符后的所有内容 currency = str_extract(financialVariable, "(?<=\\n).+"), # 给没有换行符的行(比如第一行的销售项)设置为NA currency = ifelse(is.na(currency), NA_character_, currency) ) } # 对列表中的每个数据框应用处理函数 updated_list <- map(your_list, process_single_df)
正则表达式说明
(?<=\\n).+是正向断言写法:
(?<=\\n):匹配前面是换行符的位置.+:匹配换行符之后的所有字符(也就是我们要的货币符号/代码)
方案2:合并所有数据框为一个tibble(带公司标识)
如果需要把所有公司的数据合并成一个表格,同时保留公司名称,可以用map_dfr:
# 合并并新增company列标记来源 combined_result <- map_dfr(your_list, process_single_df, .id = "company")
针对欧元符号编码异常的特殊处理
看你原始数据里欧元符号显示为\200(这是编码问题导致的显示异常),如果需要精准匹配不同货币,可以用case_when替代正则提取:
process_single_df <- function(df) { df %>% ungroup() %>% mutate( currency = case_when( str_detect(financialVariable, "\\n€|\\n\\200") ~ "€", str_detect(financialVariable, "\\nCHF") ~ "CHF", str_detect(financialVariable, "\\n£") ~ "£", TRUE ~ NA_character_ ) ) }
处理后的数据示例(以company11为例)
A tibble: 4 x 7company financialVariable
20192020202120222023currency
1 company11 B2C and B2B Sales 2 2 2 2 2 NA
2 company11 Revenue\nCHF 69,000 170,000 506,000 1,269,000 3,110,000 CHF
3 company11 Expenditure\nCHF 187,000 556,000 1,102,000 2,013,000 3,761,000 CHF
4 company11 Profit (Loss)\nCHF -118,000 -386,000 -596,000 -744,000 -651,000 CHF
内容的提问来源于stack exchange,提问作者user8959427
相关产品推荐
相关产品推荐

