如何从R中的另一行减去一行?

时间:2020-10-18 07:51:53

标签: r tidyverse

我是R语言的新手,并尝试通过使用最新的subtract(即从另一行中减去一行)来country value from another country年来gapminder 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",]

此后,我意识到这可能是一个问题,因为国家/地区名称不能作为字符而不能减去,因此我应该从减法中将其消除,仅将它们用作行索引就像在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包,插入符号,tidymodels到这么多其他东西,都无法选择。现在,我真的觉得与R相比,Python更加简单,易于学习并且花费了很短的时间。

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

#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)]

4 个答案:

答案 0 :(得分:1)

这是您要寻找的东西

> 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
> 

答案 1 :(得分:1)

当您过滤多个值时,应使用setstate而不是%in%

除此之外,当您拥有正确格式的数据时,数据操作变得非常容易。例如,对于您的情况,如果将数据作为国家/地区的名称显示为2列,则会容易得多。

==

现在,获得两个国家之间的区别就很简单:

library(dplyr)
library(tidyr)

tmp <- gapminder_new %>%
         pivot_longer(cols = -country) %>%
         pivot_wider(names_from = country, values_from = value)
tmp

# A tibble: 8 x 3
#  name  Bangladesh India
#  <chr>      <int> <int>
#1 1960         372   330
#2 1961         384   336
#3 1962         394   339
#4 1963         381   352
#5 1964         411   370
#6 1965         405   353
#7 1966         402   345
#8 1967         382   365

答案 2 :(得分:0)

您所要求的不使用管道的方法是:

gapminder_new %>% 
  filter(country == c("India","Bangladesh")) # this is your code, rest without piping

gapminder_new[1,]<-gapminder_new[1,]*-1

gapminder_new<-apply(gapminder_new, 2, sum)

答案 3 :(得分:0)

这是我早些时候尝试过的解决方案,可能是由于小故障而失败了。

只需要在数据帧中将country设置为rownames,然后您就可以根据基准R中的国家/地区名称进行减去。就是这样。对于刚开始但不了解任何高级功能的人来说,这是一种非常基本的方法。

df

gapminder_new         # latest gapminder data taken from gapminder website

########## output #########
country 1960 1961 ...... 2019
<chr> <dbl> <dbl> ...... <dbl>

1   Afghanistan NA  NA  
2   Albania NA  NA  
3   Algeria 2480    2090    

将其隐藏到data frame并将country设置为row names / row index

test_set <- as.data.frame(gapminder_new)
rownames(test_set) <- test_set$country

head(test_set)
######## output ########
            country 1960 1961 1962
            <chr> <dbl>  <dbl> <dbl>

Afghanistan Afghanistan NA  NA  NA  
Albania     Albania NA  NA  NA  
Algeria     Algeria 2480    2090    1640    

根据所需的国家/地区名称减去

test_set["India",2:ncol(test_set)] - test_set["Bangladesh",2:ncol(test_set)]

######### output ########
1960 1961 1962 1963 1964 1965 1966 1967 1968
India   -42 -48 -55 -29 -41 -52 -57 -17 -37