使用Dplyr

时间:2018-04-23 19:10:00

标签: r dplyr

使用Dplyr,我试图从以下数据中找出2002年至2006年间哪个国家的财富增幅最大。

  Country   wealth_2002           wealth_2004          wealth_2006
 Country_A      1000                  1600                  2200           
 Country_B      1200                  1300                  1800             
 Country_C      1400                  1100                  1200             
 Country_D      1500                  1000                  1100             
 Country_E      1100                  1800                  1900             

要获得国家/地区的名称,我使用了

largest_increase <- df %>%
 group_by(Country) %>%
 filter(max(wealth_2006 - wealth_2002)) %>%

这给了我

Error in filter_impl(.data, quo) : 
 Argument 2 filter condition does not evaluate to a logical vector

如果有人可以帮助我解决我的错误以及如何解决这个问题,我将非常感激。我对R很新,所以任何帮助都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

使用Base R,您可以使用which.max索引您的国家/地区列:

# This is my dummy data, you can ignore it
country <- c("Sweden", "Finland")
X1 <- c(1050, 1067)
X2 <- c(1045, 1069)
DF <- data.frame(country, X1, X2)
# Modify this to suit
DF$country[which.max(DF$X2- DF$X1)]

所以对你来说就是:

df$Country[which.max(df$wealth_2006 - df$wealth_2002)]

答案 1 :(得分:1)

看看filter是如何工作的 - 你需要为每一行提供逻辑“测试”,如果它通过,它将保留行。也没有真正需要group_by国家,因为每个国家已经是自己的行。尝试这样的事情,在那里计算并存储每个国家的财富变化,然后保留具有该最大值的国家/地区:

library(dplyr)

df <- read.table(
  text = "
  Country   wealth_2002           wealth_2004          wealth_2006
  Country_A      1000                  1600                  2200
  Country_B      1200                  1300                  1800
  Country_C      1400                  1100                  1200
  Country_D      1500                  1000                  1100
  Country_E      1100                  1800                  1900
  ", header = TRUE, stringsAsFactors = FALSE
)

df %>%
  mutate(wealth_change = wealth_2006 - wealth_2002) %>% 
  filter(wealth_change == max(wealth_change)) %>% 
  pull(Country) # gives us the Country column

输出:

[1] "Country_A"

答案 2 :(得分:1)

使用dput(data)来帮助解答问题。

structure(list(Country = structure(1:5, .Label = c("Country_A", 
"Country_B", "Country_C", "Country_D", "Country_E"), class = "factor"), 
    wealth_2002 = c(1000L, 1200L, 1400L, 1500L, 1100L), wealth_2004 = c(1600L, 
    1300L, 1100L, 1000L, 1800L), wealth_2006 = c(2200L, 1800L, 
    1200L, 1100L, 1900L)), .Names = c("Country", "wealth_2002", 
"wealth_2004", "wealth_2006"), class = "data.frame", row.names = c(NA, 
-5L))

library(dplyr)
data %>% 
mutate(delta = wealth_2006 - wealth_2004) %>% #Create a new variable called delta with mutate
arrange(desc(delta)) %>% #sort descending by 'delta' 
head(1) #return the top line.. pull out the specific value if needed

这将返回最大变化的顶行......

国家A的变化为600

答案 3 :(得分:1)

您还可以使用top_n

library(dplyr)
df %>% top_n(1,wealth_2006 - wealth_2002)

#     Country wealth_2002 wealth_2004 wealth_2006
# 1 Country_A        1000        1600        2200