R语言:如何将数据框嵌套键值对转为新列与行?
处理动态键值对的R语言方案
我来给你推荐一个用tidyverse工具链解决这个问题的方案,这套方法灵活度很高,刚好适配你这种键值对数量不固定、顺序也没规律的场景:
步骤1:准备环境与原始数据
首先加载tidyverse包(包含dplyr和tidyr,专门用来处理数据重塑),然后把你的字符向量包装成带行号的数据框——行号能帮我们后续对应回原始的每一行:
library(tidyverse) # 你的原始数据 currencyDetails <- c("Dollar:40, Euro:80, valid", "Yen:400, Pound:50", "Dollar:40, Pound:50, currency", NA) # 转成带行号的数据框,方便后续追踪原始行 df <- tibble(row_id = seq_along(currencyDetails), text = currencyDetails)
步骤2:拆分每行的键值对
用separate_rows把每行里的多个键值对拆成单独的行,这样每个键值对都能单独处理:
df_split <- df %>% separate_rows(text, sep = ", ")
步骤3:拆分键与值,处理特殊标记项
这里要分两种情况:带冒号的是「键:数值」,不带冒号的是特殊标记(比如valid、currency)。我们用separate拆分键和值,把无值的标记项的value设为1,同时把数值转成数字类型:
df_key_value <- df_split %>% separate(text, into = c("key", "value"), sep = ":", fill = "right") %>% mutate( # 无值的标记项(比如valid)设为1,其他转成数值 value = ifelse(is.na(value), 1, as.numeric(value)) )
步骤4:转成宽格式(目标输出)
用pivot_wider把长格式的键值对转成宽格式,每个key对应一列,缺失的位置用NA填充;同时确保原始的所有行(包括第四行的NA)都被保留:
result <- df_key_value %>% pivot_wider( id_cols = row_id, names_from = key, values_from = value, values_fill = NA # 如果想要把缺失值换成0,这里改成values_fill = 0即可 ) %>% # 补全所有原始行(包括第四行的NA) right_join(tibble(row_id = seq_along(currencyDetails)), by = "row_id") %>% select(-row_id) # 去掉行号列,不需要的话可以删除
最终结果
运行完上面的代码后,result就是你想要的格式:
print(result) # # A tibble: 4 × 6 # Dollar Euro valid Yen Pound currency # <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> # 1 40 80 1 NA NA NA # 2 NA NA NA 400 50 NA # 3 40 NA NA NA 50 1 # 4 NA NA NA NA NA NA
如果希望把NA换成0(比如你示例里的valid = c(1,0,0,0)),只需要把pivot_wider里的values_fill = NA改成values_fill = 0就行。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

