首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在原地替换数据中列中的值

在原地替换数据中列中的值
EN

Stack Overflow用户
提问于 2019-04-11 01:07:19
回答 4查看 111关注 0票数 3

我想替换数据框架中某些列中的值。我可以做一次,但一旦我试图构建一个函数,它就停止工作了。我还想在所有列的子集上重复这个函数,我也不知道如何做到这一点。

下面是一个例子:

代码语言:javascript
复制
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_pieLikes_sunshine中,我想把“是”换成"T“,把”否“换成"F”。但是我想指定这两列,而不包括Likes_friendship。我想保护她。除了“是”和“不是”之外,没有任何价值观。

可以用一列:

代码语言:javascript
复制
my.d = my.d %>% 
  mutate(
    Likes_pie = case_when(
      Likes_pie == 'Yes' ~ 'T',
      Likes_pie == 'No' ~ 'F'
    )
  )

但这在一个函数中行不通:

代码语言:javascript
复制
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

假设是这样的,我将如何替换每个列的列值?sg和mutate_if(d, c('Likes_pie', 'Likes_sunshine'), function(x) nomConverter(x))一样是要走的路吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-04-11 01:20:08

使用lapplyifelse的解决方案。我假设Likes_friendship是列之一(否则,为什么要创建这个向量?),但是列是否在数据框架中并不会影响该解决方案的有效性。

顺便说一下,TF是R中的保留字,分别表示逻辑值TRUEFALSE。字符"T""F"可能会使其他人感到困惑。

代码语言:javascript
复制
# 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     

数据

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2019-04-11 01:11:56

你就不能用mutate_all吗?

代码语言:javascript
复制
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

代码语言:javascript
复制
cols <- c("Likes_pie", "Likes_sunshine")
my.d %>%
    mutate_at(vars(cols), ~case_when(
        .x == "Yes" ~ "T",
        .x == "No" ~ "F",
        TRUE ~ .x))

给出同样的结果。

票数 2
EN

Stack Overflow用户

发布于 2019-04-11 01:15:11

您可以使用mutate_at()一次性完成此操作,ifelse也可以执行您想要的操作:

代码语言:javascript
复制
(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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55623281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档