R 迭代数据帧中的每个值,并将其与列中的平均值进行比较,返回一个数据帧

R 迭代数据帧中的每个值,并将其与列中的平均值进行比较,返回一个数据帧,r,function,datetime,data-manipulation,R,Function,Datetime,Data Manipulation,我正在努力编写一个函数,该函数将迭代数据帧中的每个值,并返回一个数据帧,其中的值不符合阈值,但具有相同的列名 这是一个数据帧: salary <- c(21000, 23400, 26800) bonus <- c(350, 400, 170) startdate <- as.Date(c('2010-11-1','2010-11-2','2010-11-3')) df <- data.frame(startdate, salary, bonus) 但我想将列的名称和顺

我正在努力编写一个函数,该函数将迭代数据帧中的每个值,并返回一个数据帧,其中的值不符合阈值,但具有相同的列名

这是一个数据帧:

salary <- c(21000, 23400, 26800)
bonus <- c(350, 400, 170)
startdate <- as.Date(c('2010-11-1','2010-11-2','2010-11-3'))
df <- data.frame(startdate, salary, bonus)
但我想将列的名称和顺序保存为输入数据框中的名称和顺序,并为所有列提供此视图,而不仅仅是一列

我的梦想是,我得到一个数据帧作为输出,其列与原始列相同,但如果该值低于列内的平均值,且小于对应于某个值的值(开始日期-2天),则将值替换为1,如果不满足以下条件,则将值替换为0:

   startdate salary bonus
1 2010-11-01  1       0
2 2010-11-02  1       0
3 2010-11-03  0       1
我尝试过不同的方法,包括复制数据帧,然后动态填充;使用lappy(在我的情况下,应保持几个条件)并混合使用,但没有成功。。
任何帮助都将不胜感激

看起来这就是你想要的。如果没有,这个职位将被调整

library(dplyr)

df%>%
mutate_if(is.numeric, funs(as.numeric(. < mean(.))))

  startdate salary bonus
1 2010-11-01      1     0
2 2010-11-02      1     0
3 2010-11-03      0     1
库(dplyr)
df%>%
如果(是数值的,funs(作为数值(<平均值())的形式)发生变化
起始工资奖金
1 2010-11-01      1     0
2 2010-11-02      1     0
3 2010-11-03      0     1

看起来这就是你想要的。如果没有,这个职位将被调整

library(dplyr)

df%>%
mutate_if(is.numeric, funs(as.numeric(. < mean(.))))

  startdate salary bonus
1 2010-11-01      1     0
2 2010-11-02      1     0
3 2010-11-03      0     1
库(dplyr)
df%>%
如果(是数值的,funs(作为数值(<平均值())的形式)发生变化
起始工资奖金
1 2010-11-01      1     0
2 2010-11-02      1     0
3 2010-11-03      0     1

以下是一个不使用任何库的答案。您只需在函数中使用
sapply
ifelse
Sapply
迭代列中的每个元素。编辑以包括这两个条件:

def2<-function(x){
  m<-mean(x, na.rm=T)
  sapply(x, function(y){
    ifelse(y>m,1,0)
  })
}

# Both conditions (assumes date is ordered (ascending) and doesn't have any duplicates!)
def2<-function(w,x){
  m<-mean(x, na.rm=T)
  sapply(seq_along(x), function(y){
    n<-w[y]-2
    o<-df$salary[df$startdate==n]
    ifelse((x[y]>m & x[y]>o) ,1,0)
  })
}

# Applying the function
df$bonus<-def2(x=df$salary,w=df$startdate)

def2以下是一个不使用任何库的答案。您只需在函数中使用
sapply
ifelse
Sapply
迭代列中的每个元素。编辑以包括这两个条件:

def2<-function(x){
  m<-mean(x, na.rm=T)
  sapply(x, function(y){
    ifelse(y>m,1,0)
  })
}

# Both conditions (assumes date is ordered (ascending) and doesn't have any duplicates!)
def2<-function(w,x){
  m<-mean(x, na.rm=T)
  sapply(seq_along(x), function(y){
    n<-w[y]-2
    o<-df$salary[df$startdate==n]
    ifelse((x[y]>m & x[y]>o) ,1,0)
  })
}

# Applying the function
df$bonus<-def2(x=df$salary,w=df$startdate)

def2 start_date的目的是什么?“我的梦想是获得一个数据帧作为输出,其列与原始数据帧相同,但如果值低于组内的平均值,则将值替换为1,如果值大于平均值,则将值替换为0…”那么您可能应该举一个例子,其中有一个分组列。@Parfait我还有一个条件,即用同一列中的一个值检查每个值-2天。因此,基本上我有两个条件:与一列中的平均值进行比较,以及与追溯日期相对应的值进行比较。@Gregor要与每列中的平均值进行比较,现在将对其进行编辑,谢谢代码中的几条注释:1)不要使用
paste(val)
paste(dat)
,它将转换为
字符
类。尤其是
val
,您可能希望保留为数字。2) 如果可能的话,在列上迭代几乎总是比在行上迭代好。3) 尽量不要在循环中
rbind
cbind
对象-将输出初始化为正确大小并“填充空格”比在每次迭代中“增长”对象要有效得多。4)
colMeans
函数非常有用。开始日期的目的是什么?“我的梦想是,我得到一个数据帧作为输出,其列与原始数据帧相同,但如果值低于组内的平均值,则值替换为1,如果值大于平均值,则值替换为0…”那么您可能应该举一个例子,其中有一个分组列。@Parfait我还有一个条件,即用同一列中的一个值检查每个值-2天。因此,基本上我有两个条件:与一列中的平均值进行比较,以及与追溯日期相对应的值进行比较。@Gregor要与每列中的平均值进行比较,现在将对其进行编辑,谢谢代码中的几条注释:1)不要使用
paste(val)
paste(dat)
,它将转换为
字符
类。尤其是
val
,您可能希望保留为数字。2) 如果可能的话,在列上迭代几乎总是比在行上迭代好。3) 尽量不要在循环中
rbind
cbind
对象-将输出初始化为正确大小并“填充空格”比在每次迭代中“增长”对象要有效得多。4)
colMeans
功能非常有用。值得注意的是,它可以很容易地与
groupby
组合,以满足OP的“梦想”。当然可以。如果有组,则需要
groupby
。不幸的是,OP的问题并没有提供关于团队的信息。这真的有点模糊。而且,OP对追溯日期条件的解释毫无价值。@InfiniteFlashChess谢谢你,永远忘了dplyr是多么强大。但我还有一个条件,它的值是回顾日期,这就是为什么我们想写一个函数值得注意的是,它可以很容易地与
groupby
结合起来,以满足OP的“梦想”。当然可以。如果有组,则需要
groupby
。不幸的是,OP的问题并没有提供关于团队的信息。这真的有点模糊。而且,OP对追溯日期条件的解释毫无价值。@InfiniteFlashChess谢谢你,永远忘了dplyr是多么强大。但我还有一个条件,它的值是追溯日期,这就是为什么我们想写一个函数