R 将函数应用于df1,该函数基于扩展和处理来自df1每行的数据来创建新df

R 将函数应用于df1,该函数基于扩展和处理来自df1每行的数据来创建新df,r,function,dataframe,subset,R,Function,Dataframe,Subset,我编写了一个fxn(fxn-b),当我手动将它应用到df1的每一行时,它可以正常工作。我想将fxn应用于df1,这样它会自动应用于df1的每一行 每次迭代都应该产生一个新的df,我希望新创建的df通过rbind绑定。当我尝试将fxn-b应用于df1时,它似乎只适用于第一行。错误消息还表明它没有超过df1中的第1行 顺便说一句,Fxn-b还包含另一个Fxn(Fxn-a),尽管我不相信这会影响结果。尽管如此,我将提供这两个方面 fxn-a: pythag.opp.leg<-function(R

我编写了一个fxn(
fxn-b
),当我手动将它应用到
df1
的每一行时,它可以正常工作。我想将fxn应用于
df1
,这样它会自动应用于df1的每一行

每次迭代都应该产生一个新的df,我希望新创建的df通过rbind绑定。当我尝试将fxn-b应用于df1时,它似乎只适用于第一行。错误消息还表明它没有超过df1中的第1行

顺便说一句,Fxn-b还包含另一个Fxn(Fxn-a),尽管我不相信这会影响结果。尽管如此,我将提供这两个方面

fxn-a:

pythag.opp.leg<-function(Radius){
Diam<-Radius*2
opposite<-sqrt((Diam^2)/2)
opposite.rounded<-round(opposite)
box<-opposite.rounded/2
return(box)
}    
swc.fxn<-function(df1){
box<-pythag.opp.leg(df1$Radius)
box<-round(box)<
xHigh<-df1$X+box
Xlow<-df1$X-box
Yhigh<-df1$Y+box
Ylow<-df1$Y-box
swc.box<- data.frame(X=Xlow:Xhigh, Y=Ylow:Yhigh, Z=df1[1,3])
swc.box2<-expand(swc.box, X, Y, Z)
return(swc.box2)
} 
df1<-data.frame(X=c(100,110,120,130), Y=c(90,90,90,90), 
Z=c(10,10,15,15),Radius=c(2,2,2,2))
#A tibble: 25 x 3  
X     Y     Z  
<int> <int> <dbl>    
1    98    88    10  
2    98    89    10  
3    98    90    10  
4    98    91    10  
5    98    92    10  
6    99    88    10  
7    99    89    10  
8    99    90    10  
9    99    91    10  
10    99    92    10  
... with 15 more rows  
Warning messages:  
  1: In Xlow:Xhigh :  
  numerical expression has 4 elements: only the first used  
2: In Xlow:Xhigh :  
  numerical expression has 4 elements: only the first used  
3: In Ylow:Yhigh :  
  numerical expression has 4 elements: only the first used  
4: In Ylow:Yhigh :  
  numerical expression has 4 elements: only the first used  

pythag.opp.leg如警告消息中所述
swc.fxn
只能处理一个输入

swc.fxn(df1[1, ])
这是可行的,但是如果你通过了所有的行,它就不起作用了。一种方法是使用
Map
使其同时适用于多行,并使用
lappy
扩展每个数据帧

swc.fxn <-function(df1){
   box<-pythag.opp.leg(df1$Radius)
   box<-round(box)
   Xhigh<-df1$X+box
   Xlow<-df1$X-box
   Yhigh<-df1$Y+box
   Ylow<-df1$Y-box
   swc.box<- Map(function(a, b, c, d, e) data.frame(X = a:b, Y = c:d, Z = e), 
                Xlow, Xhigh, Ylow, Yhigh, df1$Z)
   swc.box2<- lapply(swc.box, function(x) tidyr::expand(x, X, Y, Z))
   return(swc.box2)
} 
swc.fxn(df1)
#[[1]]
# A tibble: 25 x 3
#      X     Y     Z
#    <int> <int> <dbl>
# 1    98    88    10
# 2    98    89    10
# 3    98    90    10
# 4    98    91    10
# 5    98    92    10
# 6    99    88    10
# 7    99    89    10
# 8    99    90    10
# 9    99    91    10
#10    99    92    10
# … with 15 more rows

#[[2]]
# A tibble: 25 x 3
#     X     Y     Z
#   <int> <int> <dbl>
# 1   108    88    10
# 2   108    89    10
# 3   108    90    10
# 4   108    91    10
# 5   108    92    10
# 6   109    88    10
# 7   109    89    10
# 8   109    90    10
# 9   109    91    10
#10   109    92    10
# … with 15 more rows
#.....
#.....
swc.fxn <-function(df1){
   box<- round(pythag.opp.leg(df1$Radius))
   swc.box<- Map(function(a, b, c, d, e) data.frame(X = a:b, Y = c:d, Z = e), 
       df1$X-box, df1$X+box, df1$Y-box, df1$Y+box, df1$Z)
  swc.box2<- purrr::map_df(swc.box, function(x) tidyr::expand(x, X, Y, Z))
  return(swc.box2)
}