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

如何在R中将国家-年份频率表转换为仅含有效年份的数据框

R数据框转换解决方案

列名前自动加X的原因及解决办法

R的变量命名规则不允许以数字开头,所以用data.frame()创建数据框时,以数字开头的列名会被自动添加X前缀。要避免这个问题,创建数据框时加上check.names = FALSE参数即可:

df <- data.frame(country = c("Argentina", "Germany", "Korea"),
                 "1994" = c(0,2,5),
                 "1998" = c(1,0,0),
                 "2002" = c(3,0,1),
                 check.names = FALSE)

此时列名将直接是1994、1998、2002,不会带X。

转换为仅含非零年份的目标数据框

方法1:用tidyverse工具集(推荐)

先安装并加载dplyr和tidyr包,通过转长格式、过滤、分组拼接的步骤实现:

# 若未安装包,先执行:install.packages(c("dplyr", "tidyr"))
library(dplyr)
library(tidyr)

result_df <- df %>%
  # 将年份列转为长格式
  pivot_longer(cols = -country, names_to = "year", values_to = "count") %>%
  # 过滤掉计数为0的行
  filter(count != 0) %>%
  # 按国家分组,把年份用逗号拼接
  group_by(country) %>%
  summarise(years = paste(year, collapse = ", ")) %>%
  ungroup()

print(result_df)

运行后输出的结果就是你需要的格式:

# A tibble: 3 × 2
  country   years      
  <chr>     <chr>      
1 Argentina 1998, 2002 
2 Germany   1994       
3 Korea     1994, 2002

方法2:用Base R实现(无需额外包)

如果不想安装第三方包,可以用Base R的apply函数逐行处理:

# 提取年份列名(如果原列名带X,先去掉X)
year_cols <- gsub("X", "", names(df)[-1])

# 对每一行,筛选出非零对应的年份并拼接
years_list <- apply(df[, -1], 1, function(row) {
  paste(year_cols[row != 0], collapse = ", ")
})

# 组合成新数据框
result_df_base <- data.frame(
  country = df$country,
  years = years_list,
  stringsAsFactors = FALSE
)

print(result_df_base)

输出结果和方法1一致。

内容的提问来源于stack exchange,提问作者Victor Shin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:52:45