我想替换数据框中某些列的值。我可以做一次,但是一旦我尝试构建一个函数它就会停止工作。我还想在所有列的子集上重复该功能,我也不知道该怎么做。
这是一个例子:
library(tidyverse)
Kid = c('Alfie', 'Brenda', 'Charlie', 'Dalma')
Likes_pie = c('Yes', 'Yes', 'No', NA)
Likes_sunshine = c(NA, 'Yes', 'Yes', 'No')
Likes_friendship = c('Yes', NA, 'Yes', 'No')
my.d = cbind(Kid, Likes_pie, Likes_sunshine) %>% as_tibble()
我想在Likes_pie
和Likes_sunshine
中将“是”换成“T”而将“否”换成“F”。但我想指定这两列,并省略Likes_friendship
。我想保留NA-s。 “是”和“否”之外没有任何值。
可以用一列:
my.d = my.d %>%
mutate(
Likes_pie = case_when(
Likes_pie == 'Yes' ~ 'T',
Likes_pie == 'No' ~ 'F'
)
)
但是这在函数中不起作用:
valConverter = function(d, var.value){
d = d %>%
mutate(
var.value = case_when(
var.value == 'Yes' ~ 'T',
var.value == 'No' ~ 'F'
)
)
return(d)
}
my.d = valConverter(my.d, Likes_sunshine)
my.d$Likes_pie
my.d$Likes_sunshine # :E
假设确实如此,我将如何替换每列的列值?是不是像mutate_if(d, c('Likes_pie', 'Likes_sunshine'), function(x) nomConverter(x))
那样去了?
使用lapply
和ifelse
的解决方案。我假设Likes_friendship
是列之一(否则,为什么要创建此向量?),但是列是否在数据框中并不会影响此解决方案的有效性。
顺便说一句,T
和F
是R中的保留字,分别表示逻辑值TRUE
和FALSE
。角色"T"
和"F"
可能会使其他人感到困惑。
# Store the column name you want to change
cols <- c("Likes_pie", "Likes_sunshine")
my.d[cols] <- lapply(my.d[cols], function(x) ifelse(x == "Yes", "T", "F"))
my.d
# # A tibble: 4 x 4
# Kid Likes_pie Likes_sunshine Likes_friendship
# <chr> <chr> <chr> <chr>
# 1 Alfie T NA Yes
# 2 Brenda T T NA
# 3 Charlie F T Yes
# 4 Dalma NA F No
数据
library(tidyverse)
Kid = c('Alfie', 'Brenda', 'Charlie', 'Dalma')
Likes_pie = c('Yes', 'Yes', 'No', NA)
Likes_sunshine = c(NA, 'Yes', 'Yes', 'No')
Likes_friendship = c('Yes', NA, 'Yes', 'No')
my.d = cbind(Kid, Likes_pie, Likes_sunshine, Likes_friendship) %>% as_tibble()
难道你不能只使用mutate_all
?
my.d %>%
mutate_all(~case_when(
.x == "Yes" ~ "T",
.x == "No" ~ "F",
TRUE ~ .x))
## A tibble: 4 x 3
# Kid Likes_pie Likes_sunshine
# <chr> <chr> <chr>
#1 Alfie T NA
#2 Brenda T T
#3 Charlie F T
#4 Dalma NA F
或者对于特定列使用mutate_at
cols <- c("Likes_pie", "Likes_sunshine")
my.d %>%
mutate_at(vars(cols), ~case_when(
.x == "Yes" ~ "T",
.x == "No" ~ "F",
TRUE ~ .x))
给出相同的结果。
您可以使用mutate_at()
在一次点击中执行此操作,ifelse
也可以执行您想要的操作:
(my.d <- tibble(Kid, Likes_pie, Likes_sunshine, Likes_friendship) %>%
mutate_at(c("Likes_pie", "Likes_sunshine"), list(~ifelse(. == "Yes", T, F))))
# A tibble: 4 x 4
Kid Likes_pie Likes_sunshine Likes_friendship
<chr> <lgl> <lgl> <chr>
1 Alfie TRUE NA Yes
2 Brenda TRUE TRUE NA
3 Charlie FALSE TRUE Yes
4 Dalma NA FALSE No
如果打算转换为逻辑列,只需执行==
library(dplyr)
my.d %>%
mutate_at(vars(cols), list(~ . == "Yes"))
哪里
cols <- c("Likes_pie", "Likes_sunshine")