我是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)]
答案 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