我正在编写一个R脚本,以便根据随时间的变化自动检查大表中的列。我有两张桌子(两年),约有3000行(两年略有不同)和450列(两年都相同)。我想要做的是我想计算相同id的每列中值之间的差异(2014年至2015年)。不幸的是,这两年的ID数量并不相同,订单也不一样。如果两个表中的数字和顺序相同,我使用的方法才有效。请在下面找一个简短的例子:
> id <- c('a1', 'a2', 'a3', 'a4')
> year <- c(2014, 2014, 2014, 2014)
> numbers <- c(100, 200, 300, 400)
> table1 <- data.frame(id, year, numbers)
>
> id <- c('a2', 'a3', 'a4')
> year <- c(2015, 2015, 2015)
> numbers <- c(100, 200, 300)
> table2 <- data.frame(id, year, numbers)
>
我想要所有观察结果,这些观察结果在2014年具有更高的价值 单独表3:
编辑:谢谢你提出的所有建议。不幸的是,我必须得到我们R. 版本2.13,因为我使用sweave在最后创建一个报告 较新的版本有编码问题。因此,dplyr无法正常工作 (3.0.2版)。我将提供一个扩展的例子 说明我的问题好一点:> table3 <- as.data.frame(which(table2[,3] - table1[,3])<0)
当然,这不起作用,但我没有找到解决方案。一世 如果有人能帮助我,我会很高兴的。提前谢谢!
> id <- c('a1', 'a2', 'a3', 'a4')
> year <- c(2014, 2014, 2014, 2014)
> numbers1 <- c(100, 200, 300, 400)
> numbers2 <- c(100, 200, 300, 400)
> numbers3 <- c(100, 200, 300, 400)
> numbers4 <- c(100, 200, 300, 400)
> numbers5 <- c(100, 200, 300, 400)
> numbers6 <- c(100, 200, 300, 400)
> numbers7 <- c(100, 200, 300, 400)
> numbers8 <- c(100, 200, 300, 400)
> numbers9 <- c(100, 200, 300, 400)
> numbers10 <- c(100, 200, 300, 400)
> table1 <- data.frame(id, year, numbers1, numbers2, numbers3, numbers4, numbers5, numbers6, numbers7,numbers8, numbers9, numbers10)
> id <- c('a2', 'a3', 'a4') year <- c(2015, 2015, 2015)
> numbers1 <- c(100, 200, 300)
> numbers2 <- c(100, 200, 300)
> numbers3 <- c(100, 200, 300)
> numbers4 <- c(100, 200, 300)
> numbers5 <- c(100, 200, 300)
> numbers6 <- c(100, 200, 300)
> numbers7 <- c(100, 200, 300)
> numbers8 <- c(100, 200, 300)
> numbers9 <- c(100, 200, 300)
> numbers10 <- c(100, 200, 300)
> table2 <- data.frame(id, year, numbers1, numbers2, numbers3, numbers4, numbers5, numbers6, numbers7,numbers8, numbers9, numbers10)
在一天结束时,我想比较具有相同ID的相同列中的数字。任何建议都非常受欢迎,我现在被困了几天...... 谢谢!
答案 0 :(得分:1)
您可以合并数据,然后使用filter
包中的dplyr
:
library(dplyr)
merge(table1, table2, by = 'id') %>% filter(numbers.x > numbers.y)
id year.x numbers.x year.y numbers.y
1 a2 2014 200 2015 100
2 a3 2014 300 2015 200
3 a4 2014 400 2015 300
对于较大的示例,我还会使用gather
中的tidyr
函数来更改代码的格式:
merge(table1 %>% gather(key, value, -id, -year),
table2 %>% gather(key, value, -id, -year),
by = c('id', 'key')) %>%
filter(value.x > value.y)
产生以下输出(显示前6行):
id key year.x value.x year.y value.y
1 a2 numbers1 2014 200 2015 100
2 a2 numbers10 2014 200 2015 100
3 a2 numbers2 2014 200 2015 100
4 a2 numbers3 2014 200 2015 100
5 a2 numbers4 2014 200 2015 100
6 a2 numbers5 2014 200 2015 100
因此,它可以轻松扩展到任意数量的numbers
列。
答案 1 :(得分:1)
dplyr
变体
dta = rbind(table1, table2)
library(dplyr)
dta %>%
group_by(id) %>%
summarise(cond = ifelse(numbers [year == 2014] > numbers[year == 2015], numbers, 0)) %>%
filter(cond != 0)