You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:56