首页 > 解决方案 > 如何从R中的另一行中减去一行?

问题描述

我是 R 的新手,多年来一直在尝试subtract使用最新的(即从另一行减去一行)。country valuefrom another countrygapminder dataset

数据集

gapminder_new %>% 
  filter(country == c("India","Bangladesh"))

########## output ############

country 1960 1961 1962 1963   1964 1965  1966  1967
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>

Bangladesh  372 384 394 381 411 405 402 382 
India       330 336 339 352 370 353 345 365

我已经尝试了许多不同的组合,包括底座和管道,但都没有成功。

最初的失败尝试

gapminder_new %>% 
  filter(country == c("India","Bangladesh")) %>% 
  .[country == "India",] - .[country == "Bangladesh",]

###################

gapminder_new %>% 
  filter(country == c("India","Bangladesh")) %>% 
  mutate(Diff_result = (. %>% filter(country == "India") ) - (. %>% filter(country == "Bangladesh"))  )

###################

gapminder_new[country == "India",] - gapminder_new[country == "Bangladesh",]

在此之后,我意识到这可能是一个问题,因为国家名称不能被减去,因为它们是 chars,所以我应该从减法中消除它们并将它们用作行索引,就像在 python 中一样。

所以我尝试了下面的代码,但即使这样也不起作用:

按行索引减去

# setting a row index
rownames(gapminder_new) <- gapminder_new$country

# subtracting only numerical col using row index
gapminder_new["India", 2: ncol(gapminder_new)] - gapminder_new["Bangladesh", 2: ncol(gapminder_new)]

如何在基础 R 和使用管道中解决这个问题???

每天我都会在 R 中遇到 10 种不同的数据操作任务。在某个地方我们需要 pull(),在某个地方只能选择 .[[]] 而不是在其他地方。所有这些规则在哪里定义?

我不知道为什么 R 在从基础 R 到管道、从单个 ML 包到插入符号到 tidymodel 再到许多其他东西的选择上如此复杂。现在我真的觉得 Python 比 R 更简单,更容易学习,而且学习时间也很短。

(更新:这是我最终使用的,并在答案中发布了详细信息)

#convert to data frame
gapminder_new <- as.data.frame(gapminder_new)

# set country row index
rownames(gapminder_new) <- gapminder_new$country

# subtracting only numerical col using row index
gapminder_new["India", 2: ncol(gapminder_new)] - gapminder_new["Bangladesh", 2: ncol(gapminder_new)]

标签: rtidyverse

解决方案


这是你想要的:

> gapminder_new %>% select(-1) %>% mutate(across(everything(), ~lead(.x) - (.x))) %>% na.omit()
# A tibble: 1 x 8
  `1960` `1961` `1962` `1963` `1964` `1965` `1966` `1967`
   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1    -42    -48    -55    -29    -41    -52    -57    -17
> 

使用的数据:

> gapminder_new
# A tibble: 2 x 9
  country    `1960` `1961` `1962` `1963` `1964` `1965` `1966` `1967`
  <chr>       <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Bangladesh    372    384    394    381    411    405    402    382
2 India         330    336    339    352    370    353    345    365
> 

推荐阅读