如何在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
相关产品推荐
相关产品推荐

