首先我对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
来解决问题,但这会使我的代码难以理解。
我不想浪费你的时间,对不起,如果我错过了一些明显的东西。关于我哪里出错的任何提示?
答案 0 :(得分:1)
您可以将rowwise
与do
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