将函数应用于数据框的列的每个元素

时间:2020-09-13 18:00:45

标签: r for-loop apply lapply sapply

我是R的新手,我有一个问题,我有一个数据框,并且我想将此功能应用于G3列的每个元素

fun_pass <- function(calif){
  if(calif >= 10){
    x <- 1
  }else{
    x <-0
  }
  return(x)
}

问题在于该函数仅适用于 mat_data $ G3 列的第一个元素,并使用该单个值填充新的 mat_data $ pass 列。

>

我为此申请:

mat_data$pass <- apply(mat_data$G3,2,fun_pass(mat_data$G3))

目标是创建一个新列,告诉我学生是否通过了课程。

2 个答案:

答案 0 :(得分:1)

问题是if/else没有被向量化。如果将函数更改为ifelse,它将起作用。另一个问题是applyMARGIN一起使用的是data.frame / matrix。在这里,它正在提取vector'G3'

fun_pass <- function(calif) ifelse(calif >= 10, 1, 0)

这里我们也不需要ifelse

fun_pass <- function(calif) as.integer(calif >= 10)

如果是单列,请使用

mat_data$pass <- fun_pass(mat_data$G3)

答案 1 :(得分:0)

尝试:

mat_data$pass <- sapply(X = mat_data$G3, FUN  = fun_pass)

测试:

mat_data <- data.frame(G3 = 1:20)
mat_data$pass <- sapply(X = mat_data$G3, FUN  = fun_pass)

mat_data

#     G3 pass
# 1   1    0
# 2   2    0
# 3   3    0
# 4   4    0
# 5   5    0
# 6   6    0
# 7   7    0
# 8   8    0
# 9   9    0
# 10 10    1
# 11 11    1
# 12 12    1
# 13 13    1
# 14 14    1
# 15 15    1
# 16 16    1
# 17 17    1
# 18 18    1
# 19 19    1
# 20 20    1

相关问题