dplyr - 使用rowwise()时,mutate中没有正确传递的因子级别的名称

时间:2014-09-07 11:23:18

标签: r dplyr

首先我对R很新,我知道我可能犯了一个明显的错误,我已经找到了答案,但也许我正在寻找错误的东西。

我正在尝试应用一个函数,根据该行的内容向数据框添加新列。但在我看来,使用mutate时,rowwise函数中的行中的值未得到正确处理。我试图创建一个玩具示例来展示我的问题。

library(dplyr)    
x<-c("A,"B")
y<-c(1,2)
df<-data.frame(x,y)

然后我有一个函数来创建一个名为z的新列,如果y的值为x,则向"A"添加1,并向{{1}添加2如果y的值为x。请注意,我添加了"B"来显示正在发生的事情。

print(x)

然后我尝试使用calculatez <- function(x,y){ print(x) if(x == "A"){ return (y+1) } else{ return(y+2) } }

mutate

我得到以下内容,2已添加到两行,而不是1到第一行,df %>% rowwise() %>% mutate(z = calculatez(x,y)) "A"已作为"B"传递到函数中1

2

如果我删除了[1] 1 [1] 2 Source: local data frame [2 x 3] Groups: x y z 1 A 1 3 2 B 2 4 功能,则rowwise()"A"似乎正常传递,但显然我没有得到正确的结果。

"B"

如果我在没有编写自己的功能的情况下尝试这样做,我可以让它工作,然后我不会得到关于条件长度的错误消息。所以我不认为我理解df %>% mutate(z = calculatez(x,y)) [1] A B Levels: A B x y z 1 A 1 2 2 B 2 3 Warning message: In if (x == "A") { : the condition has length > 1 and only the first element will be used 正在做什么。

rowwise()

但是我希望能够使用我自己的函数,因为在我的实际应用程序中,条件更复杂,并且很难在df %>% mutate(z = ifelse(x=="A",y+1,y+2)) x y z 1 A 1 2 2 B 2 4 函数中使用大量嵌套ifelse函数进行读取

我可以通过将条件更改为mutate来解决问题,但这会使我的代码难以理解。

我不想浪费你的时间,对不起,如果我错过了一些明显的东西。关于我哪里出错的任何提示?

1 个答案:

答案 0 :(得分:1)

您可以将rowwisedo

一起使用
 df %>% 
 rowwise() %>% 
 do(data.frame(., z= calculatez(.$x, .$y)))

给出输出

     x y z
  #1 A 1 2
  #2 B 2 4

或者你可以这样做:

  df %>%
  group_by(N=row_number()) %>% 
  mutate(z=calculatez(x,y))%>% 
  ungroup() %>%
  select(-N)

使用其他数据集:

df <- structure(list(x = structure(c(1L, 1L, 2L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), y = c(1, 2, 1, 2, 1)), .Names = c("x", 
"y"), row.names = c(NA, -5L), class = "data.frame")

运行上面的代码给出:

 #  x y z
 #1 A 1 2
 #2 A 2 3
 #3 B 1 3
 #4 B 2 4
 #5 B 1 3

如果您使用data.table

library(data.table)
setDT(df)[, z := calculatez(x,y), by=seq_len(nrow(df))]
df
#    x y z
# 1: A 1 2
# 2: A 2 3
# 3: B 1 3
# 4: B 2 4
# 5: B 1 3