我有一个名为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;缺少,没有默认
答案 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))
)