在数据框

时间:2016-07-27 10:28:43

标签: r

我有一个名为Cat的数据框。我有多个列。在一个名为的矢量中 Jan.15_Transaction我有价值观。我想应用一个条件,如果值大于0然后1,则其他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)

警告讯息: 在if(x> 0){:   条件的长度> 1,只使用第一个元素

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

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

match.fun(FUN)中的错误:参数&#34; FUN&#34;缺少,没有默认

2 个答案:

答案 0 :(得分:2)

您可以使用userString.charAt(i + 1)函数向量化(=在矢量中应用)ifelse语句:

if

或者,您可以使用以下更有效(但可读性更低)的内容:

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

回到原来的功能,你的写作方式非常不像R一样。更像R的实现看起来像这样:

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

- 无需临时变量,作业或myfunc = function (x) if (x > 0) 1 else 0 声明。

答案 1 :(得分:1)

我假设您要在名称以'_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))
)