R 在ddply中使用函数

R 在ddply中使用函数,r,if-statement,plyr,R,If Statement,Plyr,我在将函数写入ddply调用时遇到问题。以下是一个基本的DF: library(plyr) Time <- c(1,2,3,4,5,6,7,8,9,10) X <- c(1,2,-3,4,-7,2,-4,9,7,-5) Y <- c(2,-3,-4,4,4,3,2,-9,9,10) T <- c(5,4,3,2,1,9,8,7,6,5) DF <- data.frame(Time,X,Y,T) 但是这两个函数都有错误,我不确定为什么我认为您需要在函数中返回结果,

我在将函数写入ddply调用时遇到问题。以下是一个基本的DF:

library(plyr)

Time <- c(1,2,3,4,5,6,7,8,9,10)
X <- c(1,2,-3,4,-7,2,-4,9,7,-5)
Y <- c(2,-3,-4,4,4,3,2,-9,9,10)
T <- c(5,4,3,2,1,9,8,7,6,5)
DF <- data.frame(Time,X,Y,T)

但是这两个函数都有错误,我不确定为什么我认为您需要在函数中返回结果,即

VD<-function(X,Y,T){
if(X > 0 & Y < 0) {return(9-T)}
if(X < 0 & Y < 0) {return(5-T)}
if(X > 0 & Y > 0) {return(9-T)}
if(X < 0 & Y > 0) {return(5-T)}
}
vd0&Y<0{return(9-T)}
如果(X<0&Y<0){返回(5-T)}
如果(X>0&Y>0){return(9-T)}
如果(X<0&Y>0){return(5-T)}
}

我认为您需要在函数中返回结果,即

VD<-function(X,Y,T){
if(X > 0 & Y < 0) {return(9-T)}
if(X < 0 & Y < 0) {return(5-T)}
if(X > 0 & Y > 0) {return(9-T)}
if(X < 0 & Y > 0) {return(5-T)}
}
vd0&Y<0{return(9-T)}
如果(X<0&Y<0){返回(5-T)}
如果(X>0&Y>0){return(9-T)}
如果(X<0&Y>0){return(5-T)}
}
vd0&Y<0{k=9-T}
如果(X<0&Y<0){k=5-T}
如果(X>0&Y>0){k=9-T}
如果(X<0&Y>0){k=5-T}
返回(k)
}
图书馆(plyr)
ddply(DF,'Time',summary,Result=VD(X,Y,T))
时间结果
1     1      4
2     2      5
3     3      2
4     4      7
5     5      4
6     6      0
7     7     -3
8     8      2
9     9      3
10   10      0
VD2 ddply(DF,'Time',summary,Result2=VD2(X))
时间结果2
1     1       1
2     2       2
3     3      12
4     4       4
5     5      16
6     6       2
7     7      13
8     8       9
9     9       7
10   10      14
vd0&Y<0{k=9-T}
如果(X<0&Y<0){k=5-T}
如果(X>0&Y>0){k=9-T}
如果(X<0&Y>0){k=5-T}
返回(k)
}
图书馆(plyr)
ddply(DF,'Time',summary,Result=VD(X,Y,T))
时间结果
1     1      4
2     2      5
3     3      2
4     4      7
5     5      4
6     6      0
7     7     -3
8     8      2
9     9      3
10   10      0
VD2 ddply(DF,'Time',summary,Result2=VD2(X))
时间结果2
1     1       1
2     2       2
3     3      12
4     4       4
5     5      16
6     6       2
7     7      13
8     8       9
9     9       7
10   10      14

在“一”功能中,另一种可能也起作用:

  data2 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=ifelse(xx[,"X"] > 0 & xx[,"Y"] < 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] < 0, {k=5-xx[,"T"]}, 
             ifelse(xx[,"X"] > 0 & xx[,"Y"] > 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] > 0, {k=5-xx[,"T"]}))))
    )})
#or

  data3 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=     if(xx[,"X"] > 0 & xx[,"Y"] < 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] < 0) {k=5-xx[,"T"]} 
             else if(xx[,"X"] > 0 & xx[,"Y"] > 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] > 0) {k=5-xx[,"T"]}
  )})

# or 

data4 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result=ifelse(with(df, X > 0 & Y < 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y < 0), {k=5-df[,t]}, 
           ifelse(with(df, X > 0 & Y > 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y > 0), {k=5-df[,t]}))) )
  )})
data4
#or

data5 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result= if(with(df, X > 0 & Y < 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y < 0)) {k=5-df[,t]} 
    else if(with(df, X > 0 & Y > 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y > 0)) {k=5-df[,t]}
  )})
data5
data2 0&xx[,“Y”]<0,{k=9-xx[,“T”},
如果else(xx[,“X”]<0&xx[,“Y”]<0,{k=5-xx[,“T”},
如果else(xx[,“X”]>0&xx[,“Y”]>0,{k=9-xx[,“T”},
ifelse(xx[,“X”]<0&xx[,“Y”]>0,{k=5-xx[,“T”})))
)})
#或
数据3 0&xx[,“Y”]<0{k=9-xx[,“T”}
如果(xx[,“X”]<0&xx[,“Y”]<0){k=5-xx[,“T”}
如果(xx[,“X”]>0&xx[,“Y”]>0){k=9-xx[,“T”}
如果(xx[,“X”]<0&xx[,“Y”]>0){k=5-xx[,“T”}
)})
#或
数据4 0&Y<0,{k=9-df[,t]},
ifelse(带(df,X<0&Y<0),{k=5-df[,t]},
ifelse(带(df,X>0&Y>0),{k=9-df[,t]},
ifelse(带(df,X<0&Y>0),{k=5-df[,t]})))
)})
数据4
#或
数据5 0&Y<0)){k=9-df[,t]}
else如果(带(df,X<0&Y<0)){k=5-df[,t]}
else if(带(df,X>0&Y>0)){k=9-df[,t]}
else如果(带(df,X<0&Y>0)){k=5-df[,t]}
)})
数据5

在“一”功能中,另一种可能也起作用:

  data2 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=ifelse(xx[,"X"] > 0 & xx[,"Y"] < 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] < 0, {k=5-xx[,"T"]}, 
             ifelse(xx[,"X"] > 0 & xx[,"Y"] > 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] > 0, {k=5-xx[,"T"]}))))
    )})
#or

  data3 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=     if(xx[,"X"] > 0 & xx[,"Y"] < 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] < 0) {k=5-xx[,"T"]} 
             else if(xx[,"X"] > 0 & xx[,"Y"] > 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] > 0) {k=5-xx[,"T"]}
  )})

# or 

data4 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result=ifelse(with(df, X > 0 & Y < 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y < 0), {k=5-df[,t]}, 
           ifelse(with(df, X > 0 & Y > 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y > 0), {k=5-df[,t]}))) )
  )})
data4
#or

data5 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result= if(with(df, X > 0 & Y < 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y < 0)) {k=5-df[,t]} 
    else if(with(df, X > 0 & Y > 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y > 0)) {k=5-df[,t]}
  )})
data5
data2 0&xx[,“Y”]<0,{k=9-xx[,“T”},
如果else(xx[,“X”]<0&xx[,“Y”]<0,{k=5-xx[,“T”},
如果else(xx[,“X”]>0&xx[,“Y”]>0,{k=9-xx[,“T”},
ifelse(xx[,“X”]<0&xx[,“Y”]>0,{k=5-xx[,“T”})))
)})
#或
数据3 0&xx[,“Y”]<0{k=9-xx[,“T”}
如果(xx[,“X”]<0&xx[,“Y”]<0){k=5-xx[,“T”}
如果(xx[,“X”]>0&xx[,“Y”]>0){k=9-xx[,“T”}
如果(xx[,“X”]<0&xx[,“Y”]>0){k=5-xx[,“T”}
)})
#或
数据4 0&Y<0,{k=9-df[,t]},
ifelse(带(df,X<0&Y<0),{k=5-df[,t]},
ifelse(带(df,X>0&Y>0),{k=9-df[,t]},
ifelse(带(df,X<0&Y>0),{k=5-df[,t]})))
)})
数据4
#或
数据5 0&Y<0)){k=9-df[,t]}
else如果(带(df,X<0&Y<0)){k=5-df[,t]}
else if(带(df,X>0&Y>0)){k=9-df[,t]}
else如果(带(df,X<0&Y>0)){k=5-df[,t]}
)})
数据5

此外,函数
VD2
X>0
时不返回任何内容,因此在
ddply
中尝试使用时会出错。此外,函数
VD2
X>0
时不返回任何内容,因此在
ddply
中尝试使用时会出错。
VD<-function(X,Y,T){
if(X > 0 & Y < 0) {k=9-T}
if(X < 0 & Y < 0) {k=5-T}
if(X > 0 & Y > 0) {k=9-T}
if(X < 0 & Y > 0) {k=5-T}
return(k)
}
library(plyr)
 ddply(DF,'Time',summarize,Result=VD(X,Y,T))
   Time Result
1     1      4
2     2      5
3     3      2
4     4      7
5     5      4
6     6      0
7     7     -3
8     8      2
9     9      3
10   10      0

VD2<-function(X){
    if(X<0) {k=9-X}
     if(X>0) {k=X}
     return(k)
 }
> ddply(DF,'Time',summarize,Result2=VD2(X))
   Time Result2
1     1       1
2     2       2
3     3      12
4     4       4
5     5      16
6     6       2
7     7      13
8     8       9
9     9       7
10   10      14
  data2 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=ifelse(xx[,"X"] > 0 & xx[,"Y"] < 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] < 0, {k=5-xx[,"T"]}, 
             ifelse(xx[,"X"] > 0 & xx[,"Y"] > 0, {k=9-xx[,"T"]},
             ifelse(xx[,"X"] < 0 & xx[,"Y"] > 0, {k=5-xx[,"T"]}))))
    )})
#or

  data3 <- plyr::ddply (DF, "Time", .fun=function(xx){
    c(Result=     if(xx[,"X"] > 0 & xx[,"Y"] < 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] < 0) {k=5-xx[,"T"]} 
             else if(xx[,"X"] > 0 & xx[,"Y"] > 0) {k=9-xx[,"T"]}
             else if(xx[,"X"] < 0 & xx[,"Y"] > 0) {k=5-xx[,"T"]}
  )})

# or 

data4 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result=ifelse(with(df, X > 0 & Y < 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y < 0), {k=5-df[,t]}, 
           ifelse(with(df, X > 0 & Y > 0), {k=9-df[,t]},
           ifelse(with(df, X < 0 & Y > 0), {k=5-df[,t]}))) )
  )})
data4
#or

data5 <- plyr::ddply (DF, "Time", .fun=function(df,t="T"){
  c(Result= if(with(df, X > 0 & Y < 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y < 0)) {k=5-df[,t]} 
    else if(with(df, X > 0 & Y > 0)) {k=9-df[,t]}
    else if(with(df, X < 0 & Y > 0)) {k=5-df[,t]}
  )})
data5