首页 > 解决方案 > 从 Excel 迁移到 R:如何根据特定的单元格值操作数据?

问题描述

我正在慢慢地从 Excel 迁移到 R,但在 Excel 中需要花费我两秒钟才能完成的任务时遇到问题……例如,请参阅以下数据示例,即法国和英国的 GDP:

df

假设我想计算 1929 年的百分比变化,也就是大萧条。在 Excel 中,我会在法国的新列中执行类似的操作:=(B2/$B$11)*100然后将公式向下填充到相邻的单元格。然后,重复英国。

你将如何在 R 中做到这一点(注意,这只是一个例子。我对背后的思考过程很感兴趣)?显然,数据的结构会因三个变量而不同:年份、国家、gdp。

我正在考虑使用mutate()然后case_when()确定正确的国家。但这就是我卡住的地方。看看我的代码。数据是麦迪逊

library(tidyverse)
library(ggplot2)
library(haven)
library(readxl)

# Loading df
df <- read_excel("/PATH TO DATA/mpd2018.xlsx", sheet = 2)

# Tidy dataset
df <- df %>%
  transmute(
    cntry = as_factor(countrycode), # Rename and define as factor
    year = zap_labels(year), # Zap labels
    gdp = zap_labels(rgdpnapc) # Rename and zap labels
  ) %>%
  dplyr::filter(
    cntry %in% c("FRA","GBR"), # Keep only FRA and GRB
    year >= 1920 & year <= 1950 # Only the interval between 1920 and 1950
  )

# Calculations 
 df <- df %>% mutate(
              gdp_rel = case_when(
                cntry == "FRA" ~ (df$gdp/df[10,3])*100,
                cntry == "GBR" ~ (df$gdp/df[41,3])*100
              ))
                

首先,代码会产生错误。但更重要的是,我相信它可以比精确定位更智能df[x, y]。什么是数据框要大得多?

标签: rmath

解决方案


一旦你放弃了语法,R 通常更具可扩展性并且更容易执行此类任务。

您可以使用across将函数应用于多个列。在这里,across我们提到了我们想要应用函数的列 ( France, UK),然后提到我们想要应用的函数。

library(dplyr)
df %>% mutate(across(c(France, UK), ~./.[Year == 1929] * 100))

推荐阅读