使用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很新,所以任何帮助都会受到赞赏。
答案 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