我想使用dplyr比较分组data.frame中的值,并创建一个虚拟变量或类似的东西,指示哪个更大。无法理解!
以下是一些可重现的代码:
table <- structure(list(species = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("Adelophryne adiastola",
"Adelophryne gutturosa"), class = "factor"), scenario = structure(c(3L,
1L, 2L, 3L, 1L, 2L), .Label = c("future1", "future2", "present"
), class = "factor"), amount = c(5L, 3L, 2L, 50L, 60L, 40L)), .Names = c("species",
"scenario", "amount"), class = "data.frame", row.names = c(NA,
-6L))
> table
species scenario amount
1 Adelophryne adiastola present 5
2 Adelophryne adiastola future1 3
3 Adelophryne adiastola future2 2
4 Adelophryne gutturosa present 50
5 Adelophryne gutturosa future1 60
6 Adelophryne gutturosa future2 40
我会按照species
对df进行分组。
我想创建一个新列,可以是increase_amount
,其中每个“future”中的金额与“present”进行比较。当值增加时我可以得到1,当它减少时我得到0。
我一直在尝试使用for循环来抛出每个物种,但df包含超过50,000个物种,而且我需要重新进行操作的时间太长...
有人知道吗? 非常感谢!
答案 0 :(得分:1)
你可以这样做:
table %>%
group_by(species) %>%
mutate(tmp = amount[scenario == "present"]) %>%
mutate(increase_amount = ifelse(amount > tmp, 1, 0))
# Source: local data frame [6 x 5]
# Groups: species [2]
#
# species scenario amount tmp increase_amount
# <fctr> <fctr> <int> <int> <dbl>
# 1 Adelophryne adiastola present 5 5 0
# 2 Adelophryne adiastola future1 3 5 0
# 3 Adelophryne adiastola future2 2 5 0
# 4 Adelophryne gutturosa present 50 50 0
# 5 Adelophryne gutturosa future1 60 50 1
# 6 Adelophryne gutturosa future2 40 50 0
答案 1 :(得分:0)
我们可以使用ave
base R
执行此操作
table$increase_amount <- with(table, as.integer(amount > ave(amount *
(scenario == "present"), species, FUN = function(x) x[x!=0])))
table$increase_amount
#[1] 0 0 0 0 1 0
答案 2 :(得分:0)
听起来您可以使用lag()
快速找到随时间变化的差异。我建议重新构造scenario
(时间)变量,以便可以使用R函数直观地对其进行重新排序(即arrange()
将按字母顺序将scenario
变量重新排序为future1,future2,present,在这种情况下将无法正常工作。)
df <- data.frame(species=rep(letters,3),
scenario=rep(1:3,26),
amount=runif(78))
summary(df)
glimpse(df)
df %>% count(species,scenario)
df %>%
arrange(species,scenario) %>% # arrange scenario by ascending order
group_by(species) %>%
mutate(diff1=amount-lag(amount), # calculate difference from time 1 -> 2, and time 2 -> 3
diff2=amount-lag(amount,2)) # calculate difference from time 1 -> 3
lag()
的输出将在每个分组中的前NA
个值中产生scenario
,但是可以使用ifelse()
语句或{ {1}}。
filter()