【问题标题】:Apply function in data frame在数据框中应用函数
【发布时间】:2016-07-27 10:28:42
【问题描述】:

我有一个名为 Cat 的数据框。我有多个专栏。在一个名为 Jan.15_Transaction 我有价值观。我想应用一个条件,如果值大于 0,则 1 else 0。所以我不想使用 if else 条件,因为有 42 列与此类似,我想在其中应用相同的相同逻辑。

Jan.15_Transaction   Feb.15_Transaction  
1                         1    
2                         2  
3                         3  
4                         4  

因此我构建了这个函数

myfunc <- function(x){
if(x > 0){
  x=1
} 
else {
  x=0
}
return(x)
}

仅当我使用此代码时才会将其应用于第一个元素。

Cat$Jan.15_Transaction.1<-myfunc(Cat$Jan.15_Transaction)

警告信息: 如果 (x > 0) { : 条件的长度 > 1,并且只使用第一个元素

所以我尝试了 sapply 并在下面得到了这个错误

sapply(Cat$Jan.15_Transaction.1, myfunction(Cat))

match.fun(FUN) 中的错误:缺少参数“FUN”,没有默认值

【问题讨论】:

  • 也许cbind(mydf, as.numeric(mydf[, mySubsetofColumns] &gt; 0)) ?
  • 请将错误信息添加到您的帖子中。

标签: r


【解决方案1】:

您可以使用ifelse 函数对if 语句进行向量化(= 应用于向量):

myfunc = function (x)
    ifelse(x > 0, 1, 0)

或者,您可以使用以下更有效(但可读性较差):

myfunc = function (x)
    as.integer(x > 0)

回到你原来的函数,你写它的方式很不像 R。更类似于 R 的实现如下所示:

myfunc = function (x)
    if (x > 0) 1 else 0

——不需要临时变量、赋值或return 语句。

【讨论】:

  • 谢谢鲁道夫。它有助于。我有 42 列我想在其中使用我的函数。有没有办法选择那些特定的列,应用函数并通过在同一数据框中创建单独的向量来显示结果。
  • 如果所有列都是数字,您可以在整个 data.frame 上使用 ifelse,例如 ifelse(dat&gt;0,1,0)。否则看看apply
【解决方案2】:

我假设您想将该函数应用于名称以“_Transaction”结尾的列。这可以通过基本函数grepl 来完成。

vars <- grepl('_Transaction', names(df))
df[, vars] <- ifelse(df[, vars] > 0, 1, 0)

您也可以使用dplyr,如下所示。这也可以推广到更复杂的功能。

binarizer <- function(x) ifelse(x > 0, 1, 0)

df <- bind_cols(
  df %>% select(-ends_with('_Transaction')),
  df %>% select(ends_with('_Transaction')) %>% 
    mutate_each(funs(binarizer))
)

【讨论】:

  • 错误:找不到函数“bind_cols”我找不到 bind_cols
  • bind_cols 函数是dplyr 包的一部分。
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多