R- ddply with 循环遍历每一行
R- ddply with loop to iterate over each row
我需要获取每一行的历史记录。
如果我的 table 是:
aa<-data.frame(tel=c(1,1,1,1,2,2,2,2,3,3), hora=c(1,2,4,4,1,1,3,4,1,2),
intentos=c(1,5,1,4,9,2,7,8,8,1), contactos=c(0,1,0,0,0,1,0,1,0,1))
我需要为每个电话获取一种趋势变量 "intentos":对于实例实际值/先前值,但对于每一行。 created1=c(NA, 5/1, 1/5, 4/1) 第一个电话。
我想要的table是:
tel hora intentos contactos created1
1 1 1 1 0 NA
2 1 2 5 1 5
3 1 4 1 0 0.2
4 1 4 4 0 4
5 2 1 9 0 NA
6 2 1 2 1 0.222222222
7 2 3 7 0 3.5
8 2 4 8 1 1.142857143
9 3 1 8 0 NA
10 3 2 1 1 0.125
我知道我可以做如下事情:
library(plyr)
ddply(aa, .(tel), mutate, mean_hora=mean(hora), min_hora=min(hora))
但是我怎样才能引入循环来得到描述的结果呢?
我试图创建一个传递给 ddply 的函数:
g<-function (tbl) {x<-data.frame(tbl)
for (i in 2:length(tbl) ){
print(paste0(i-1))
print(tbl[i-1])
x[i,1]<-
tbl[i]/tbl[i-1] }
return (x)}
如果我 运行 这是一个矢量,它就可以工作。
所以我试图将它传递给 ddply 函数:
library(plyr)
ddply(aa, .(tel), mutate, mean_hora=mean(hora), min_hora=min(hora), created1=g(hora))
但我收到以下错误:
Error: not compatible with STRSXP
我的方法(传递一个函数来评估每个向量)可以吗?
这应该可以解决问题:
aa %>%
group_by(tel) %>%
mutate(lagged_intentos=lag(intentos)) %>%
mutate(created1=intentos/lagged_intentos) %>%
select(-lagged_intentos)
tel hora intentos contactos created1
1 1 1 1 0 NA
2 1 2 5 1 5.0000000
3 1 4 1 0 0.2000000
4 1 4 4 0 4.0000000
5 2 1 9 0 NA
6 2 1 2 1 0.2222222
7 2 3 7 0 3.5000000
8 2 4 8 1 1.1428571
9 3 1 8 0 NA
10 3 2 1 1 0.1250000
如果您想对数据集中的所有其他变量执行此操作,则:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)))
tel hora intentos contactos
1 1 NA NA NA
2 1 2.000000 5.0000000 Inf
3 1 2.000000 0.2000000 0
4 1 1.000000 4.0000000 NaN
5 2 NA NA NA
6 2 1.000000 0.2222222 Inf
7 2 3.000000 3.5000000 0
8 2 1.333333 1.1428571 Inf
9 3 NA NA NA
10 3 2.000000 0.1250000 Inf
或者,如果只有一部分变量:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)),hora,intentos)
tel hora intentos contactos
1 1 NA NA 0
2 1 2.000000 5.0000000 1
3 1 2.000000 0.2000000 0
4 1 1.000000 4.0000000 0
5 2 NA NA 0
6 2 1.000000 0.2222222 1
7 2 3.000000 3.5000000 0
8 2 1.333333 1.1428571 1
9 3 NA NA 0
10 3 2.000000 0.1250000 1
不幸的是,我认为这是 dplyr 中的一个当前错误,它用变异的变量覆盖了变量。您可以通过以下方式将它们重新添加:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)),hora,intentos) %>%
cbind(aa,.) %>%
data.frame %>%
select(-tel.1)
tel hora intentos contactos hora.1 intentos.1 contactos.1
1 1 1 1 0 NA NA 0
2 1 2 5 1 2.000000 5.0000000 1
3 1 4 1 0 2.000000 0.2000000 0
4 1 4 4 0 1.000000 4.0000000 0
5 2 1 9 0 NA NA 0
6 2 1 2 1 1.000000 0.2222222 1
7 2 3 7 0 3.000000 3.5000000 0
8 2 4 8 1 1.333333 1.1428571 1
9 3 1 8 0 NA NA 0
10 3 2 1 1 2.000000 0.1250000 1
我需要获取每一行的历史记录。 如果我的 table 是:
aa<-data.frame(tel=c(1,1,1,1,2,2,2,2,3,3), hora=c(1,2,4,4,1,1,3,4,1,2),
intentos=c(1,5,1,4,9,2,7,8,8,1), contactos=c(0,1,0,0,0,1,0,1,0,1))
我需要为每个电话获取一种趋势变量 "intentos":对于实例实际值/先前值,但对于每一行。 created1=c(NA, 5/1, 1/5, 4/1) 第一个电话。
我想要的table是:
tel hora intentos contactos created1
1 1 1 1 0 NA
2 1 2 5 1 5
3 1 4 1 0 0.2
4 1 4 4 0 4
5 2 1 9 0 NA
6 2 1 2 1 0.222222222
7 2 3 7 0 3.5
8 2 4 8 1 1.142857143
9 3 1 8 0 NA
10 3 2 1 1 0.125
我知道我可以做如下事情:
library(plyr)
ddply(aa, .(tel), mutate, mean_hora=mean(hora), min_hora=min(hora))
但是我怎样才能引入循环来得到描述的结果呢?
我试图创建一个传递给 ddply 的函数:
g<-function (tbl) {x<-data.frame(tbl)
for (i in 2:length(tbl) ){
print(paste0(i-1))
print(tbl[i-1])
x[i,1]<-
tbl[i]/tbl[i-1] }
return (x)}
如果我 运行 这是一个矢量,它就可以工作。 所以我试图将它传递给 ddply 函数:
library(plyr)
ddply(aa, .(tel), mutate, mean_hora=mean(hora), min_hora=min(hora), created1=g(hora))
但我收到以下错误:
Error: not compatible with STRSXP
我的方法(传递一个函数来评估每个向量)可以吗?
这应该可以解决问题:
aa %>%
group_by(tel) %>%
mutate(lagged_intentos=lag(intentos)) %>%
mutate(created1=intentos/lagged_intentos) %>%
select(-lagged_intentos)
tel hora intentos contactos created1
1 1 1 1 0 NA
2 1 2 5 1 5.0000000
3 1 4 1 0 0.2000000
4 1 4 4 0 4.0000000
5 2 1 9 0 NA
6 2 1 2 1 0.2222222
7 2 3 7 0 3.5000000
8 2 4 8 1 1.1428571
9 3 1 8 0 NA
10 3 2 1 1 0.1250000
如果您想对数据集中的所有其他变量执行此操作,则:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)))
tel hora intentos contactos
1 1 NA NA NA
2 1 2.000000 5.0000000 Inf
3 1 2.000000 0.2000000 0
4 1 1.000000 4.0000000 NaN
5 2 NA NA NA
6 2 1.000000 0.2222222 Inf
7 2 3.000000 3.5000000 0
8 2 1.333333 1.1428571 Inf
9 3 NA NA NA
10 3 2.000000 0.1250000 Inf
或者,如果只有一部分变量:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)),hora,intentos)
tel hora intentos contactos
1 1 NA NA 0
2 1 2.000000 5.0000000 1
3 1 2.000000 0.2000000 0
4 1 1.000000 4.0000000 0
5 2 NA NA 0
6 2 1.000000 0.2222222 1
7 2 3.000000 3.5000000 0
8 2 1.333333 1.1428571 1
9 3 NA NA 0
10 3 2.000000 0.1250000 1
不幸的是,我认为这是 dplyr 中的一个当前错误,它用变异的变量覆盖了变量。您可以通过以下方式将它们重新添加:
aa %>%
group_by(tel) %>%
mutate_each(funs(new=./lag(.)),hora,intentos) %>%
cbind(aa,.) %>%
data.frame %>%
select(-tel.1)
tel hora intentos contactos hora.1 intentos.1 contactos.1
1 1 1 1 0 NA NA 0
2 1 2 5 1 2.000000 5.0000000 1
3 1 4 1 0 2.000000 0.2000000 0
4 1 4 4 0 1.000000 4.0000000 0
5 2 1 9 0 NA NA 0
6 2 1 2 1 1.000000 0.2222222 1
7 2 3 7 0 3.000000 3.5000000 0
8 2 4 8 1 1.333333 1.1428571 1
9 3 1 8 0 NA NA 0
10 3 2 1 1 2.000000 0.1250000 1