在数据框行上应用函数
Apply function over data frame rows
我正在尝试对数据框的行应用一个函数,并 return 一个基于列中每个元素的值的值。我更愿意传递整个数据框而不是命名每个变量,因为实际代码有很多变量——这是一个简单的例子。
我已经尝试了 purrr map_dbl
和 rowwise
,但都无法正常工作。有什么建议吗?
#sample df
df <- data.frame(Y=c("A","B","B","A","B"),
X=c(1,5,8,23,31))
#required result
Res <- data.frame(Y=c("A","B","B","A","B"),
X=c(1,5,8,23,31),
NewVal=c(10,500,800,230,3100)
)
#use mutate and map or rowwise etc
Res <- df %>%
mutate(NewVal=map_dbl(.x=.,.f=FnAdd(.)))
Res <- df %>%
rowwise() %>%
mutate(NewVal=FnAdd(.))
#sample fn
FnAdd <- function(Data){
if(Data$Y=="A"){
X=Data$X*10
}
if(Data$Y=="B"){
X=Data$X*100
}
return(X)
}
如果有多个值,最好有一个key/val
数据集,加入然后做乘法运算
keyVal <- data.frame(Y = c("A", "B"), NewVal = c(10, 100))
df %>%
left_join(keyVal) %>%
mutate(NewVal = X*NewVal)
# Y X NewVal
#1 A 1 10
#2 B 5 500
#3 B 8 800
#4 A 23 230
#5 B 31 3100
不清楚实际数据集 'Y' 列中有多少个唯一值。如果我们只有几个值,那么可以用case_when
FnAdd <- function(Data){
Data %>%
mutate(NewVal = case_when(Y == "A" ~ X * 10,
Y == "B" ~ X *100,
TRUE ~ X))
}
FnAdd(df)
# Y X NewVal
#1 A 1 10
#2 B 5 500
#3 B 8 800
#4 A 23 230
#5 B 31 3100
您最初是在寻找使用 dplyr's rowwise
() 函数的解决方案,所以这是该解决方案。这种方法的好处是您不需要创建单独的函数。
这是使用 if()
的版本
df %>%
rowwise() %>%
mutate(NewVal = ifelse(Y == "A", X * 10,
ifelse(Y == "B", X * 100)))
这里是使用 case_when 的版本:
df %>%
rowwise() %>%
mutate(NewVal = case_when(Y == "A" ~ X * 10,
Y == "B" ~ X * 100))
我正在尝试对数据框的行应用一个函数,并 return 一个基于列中每个元素的值的值。我更愿意传递整个数据框而不是命名每个变量,因为实际代码有很多变量——这是一个简单的例子。
我已经尝试了 purrr map_dbl
和 rowwise
,但都无法正常工作。有什么建议吗?
#sample df
df <- data.frame(Y=c("A","B","B","A","B"),
X=c(1,5,8,23,31))
#required result
Res <- data.frame(Y=c("A","B","B","A","B"),
X=c(1,5,8,23,31),
NewVal=c(10,500,800,230,3100)
)
#use mutate and map or rowwise etc
Res <- df %>%
mutate(NewVal=map_dbl(.x=.,.f=FnAdd(.)))
Res <- df %>%
rowwise() %>%
mutate(NewVal=FnAdd(.))
#sample fn
FnAdd <- function(Data){
if(Data$Y=="A"){
X=Data$X*10
}
if(Data$Y=="B"){
X=Data$X*100
}
return(X)
}
如果有多个值,最好有一个key/val
数据集,加入然后做乘法运算
keyVal <- data.frame(Y = c("A", "B"), NewVal = c(10, 100))
df %>%
left_join(keyVal) %>%
mutate(NewVal = X*NewVal)
# Y X NewVal
#1 A 1 10
#2 B 5 500
#3 B 8 800
#4 A 23 230
#5 B 31 3100
不清楚实际数据集 'Y' 列中有多少个唯一值。如果我们只有几个值,那么可以用case_when
FnAdd <- function(Data){
Data %>%
mutate(NewVal = case_when(Y == "A" ~ X * 10,
Y == "B" ~ X *100,
TRUE ~ X))
}
FnAdd(df)
# Y X NewVal
#1 A 1 10
#2 B 5 500
#3 B 8 800
#4 A 23 230
#5 B 31 3100
您最初是在寻找使用 dplyr's rowwise
() 函数的解决方案,所以这是该解决方案。这种方法的好处是您不需要创建单独的函数。
这是使用 if()
的版本 df %>%
rowwise() %>%
mutate(NewVal = ifelse(Y == "A", X * 10,
ifelse(Y == "B", X * 100)))
这里是使用 case_when 的版本:
df %>%
rowwise() %>%
mutate(NewVal = case_when(Y == "A" ~ X * 10,
Y == "B" ~ X * 100))