使用字符值填充数据框中的新列的逻辑操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用字符值填充数据框中的新列的逻辑操作相关的知识,希望对你有一定的参考价值。

我有一个关于各国宽带数据的数据框(以AT_df为例)。 “ofTV”和“ofWithFT”列具有类型特征,并指示每种情况(宽带提供)是否带有捆绑的电视接入或固定电话接入,具有(或不具有)它们两者。

ofWithTV    ofWithFT  
no          no
no          no
no          no
yes         no
yes         no
no          no
no          yes
no          yes
no          yes
no          yes
yes         yes
yes         yes

我想创建一个新的“ofProduct”列,其中这些案例将被称为“Singleplay”,其中两个事件都是“no”,“TV Doubleplay”,其中事件为“是”;事件为“不”的“不”,“FT Doubleplay”; “是”和“三重播放”,其中两个事件都是“是”。像这样的东西:

ofWithTV    ofWithFT   ofProduct
no          no         Singleplay
no          no         Singleplay
no          no         Singleplay
yes         no         TV Doubleplay 
yes         no         TV Doubleplay
no          no         Singleplay
no          yes        FT Doubleplay
no          yes        FT Doubleplay
no          yes        FT Doubleplay
no          yes        FT Doubleplay
yes         yes        Tripleplay
yes         yes        Tripleplay

为此,我需要一个逻辑操作来分配新值“Singelplay,Doubleplay,...”而不删除/覆盖现有数据。我已经搜索了类似的东西,但无法找到/理解这些操作实际上是如何工作的..

我是这个社区的新手,也是R的新手(这里的第一篇文章)。希望有人可以提供帮助。

答案

我们可以使用case_when

library(dplyr)

dat2 <- dat %>%
  mutate(ofProduct = case_when(
    ofWithTV %in% "no" & ofWithFT %in% "no"   ~ "Singleplay",
    ofWithTV %in% "yes" & ofWithFT %in% "no"  ~ "TV Doubleplay",
    ofWithTV %in% "no" & ofWithFT %in% "yes"  ~ "FT Doubleplay",
    ofWithTV %in% "yes" & ofWithFT %in% "yes" ~ "Tripleplay"
  ))
dat2
#    ofWithTV ofWithFT     ofProduct
# 1        no       no    Singleplay
# 2        no       no    Singleplay
# 3        no       no    Singleplay
# 4       yes       no TV Doubleplay
# 5       yes       no TV Doubleplay
# 6        no       no    Singleplay
# 7        no      yes FT Doubleplay
# 8        no      yes FT Doubleplay
# 9        no      yes FT Doubleplay
# 10       no      yes FT Doubleplay
# 11      yes      yes    Tripleplay
# 12      yes      yes    Tripleplay

或者我们可以先创建一个查找表,然后将表连接到原始数据框。

library(dplyr)
library(tibble)

look_up <- tribble(
  ~ofWithTV, ~ofWithFT, ~ofProduct,
  "no"     , "no"     , "Singleplay",
  "yes"    , "no"     , "TV Doubleplay",
  "no"     , "yes"    , "FT Doubleplay",
  "yes"    , "yes"    , "Tripleplay"
)

dat3 <- dat %>%
  left_join(look_up, by = c('ofWithTV', "ofWithFT"))
dat3
#    ofWithTV ofWithFT     ofProduct
# 1        no       no    Singleplay
# 2        no       no    Singleplay
# 3        no       no    Singleplay
# 4       yes       no TV Doubleplay
# 5       yes       no TV Doubleplay
# 6        no       no    Singleplay
# 7        no      yes FT Doubleplay
# 8        no      yes FT Doubleplay
# 9        no      yes FT Doubleplay
# 10       no      yes FT Doubleplay
# 11      yes      yes    Tripleplay
# 12      yes      yes    Tripleplay

数据

dat <- read.table(text = "ofWithTV    ofWithFT  
no          no
no          no
no          no
yes         no
yes         no
no          no
no          yes
no          yes
no          yes
no          yes
yes         yes
yes         yes",
                  header = TRUE, stringsAsFactors = FALSE)

以上是关于使用字符值填充数据框中的新列的逻辑操作的主要内容,如果未能解决你的问题,请参考以下文章

有没有比在 python 中使用 loc 更快的方法来根据现有数据框填充数据框中的新列?

如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?

向数据框中的新列添加值

将列中的所有值复制到熊猫数据框中的新列

Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]