R当字符串长度不同时,将字符串分成多列,dplyr

问题描述 投票:0回答:2

我有动物追踪数据,随着时间的推移,每只动物都遇到过,每次相遇时都记录了性别。共有三种类型的遭遇(类型1,类型2和类型3)。每行代表一只动物,每次相遇分为M(雄性)或F(雌性)。类型中的每个字符都代表一个相遇(例如,MMMM是四次见过的动物,每次都记录为雄性)。

样本数据:

animal.ID    type1         type2       type3
1            MMMMMMM       M           M
2            MFMM          M           M
3            FFM           F           F
4            FFFFFFFFF     F           F  
5            MM            M           M

我想知道每只动物的性别(男性或女性)是否一致。

我想产生这样的内容,其中一列表示性别是否一致地(1)一致记录(0)。

animal.ID    type1         type2       type3    consistent
1            MMMMMMM       M           M         1
2            MFMM          M           M         0
3            FFM           F           F         0
4            FFFFFFFFF     F           F         1
5            MM            M           M         1

我可以使用if_else获取type2和type3数据的'consistent'列:

df %>%
   mutate(consistent = if_else(type2 == type3), 1, 0))

但是,我无法包含type1数据,因为它在每个字符串中包含多个字符,并且在每个字符串中具有不同数量的字符。

一种方法可能是使用str_split将type1分成多列,但鉴于每个字符串中的字符数不同,我不知道该怎么做。

r dplyr tidyverse stringr stringi
2个回答
2
投票

一种方法可能是使用strsplitunlist,检查所有字符是否等于type2(除了检查type2等于type3)。

df %>%
  rowwise() %>%
  mutate(consistent = ifelse(type2 == type3 & all(unlist(strsplit(type1, "")) == type2), 1, 0))

输出

# A tibble: 5 x 5
  animal.ID type1     type2 type3 consistent
      <int> <chr>     <chr> <chr>      <dbl>
1         1 MMMMMMM   M     M              1
2         2 MFMM      M     M              0
3         3 FFM       F     F              0
4         4 FFFFFFFFF F     F              1
5         5 MM        M     M              1

0
投票

我们可以使用charToRaw获得type1的“原始”表示,如果它们都相同,则分配1。

df$consistent <- +(sapply(df$type1, function(x) length(unique(charToRaw(x)))) ==1)

使用dplyr,我们可以使用与::相同的逻辑>

library(dplyr)

df %>%
  rowwise() %>%
  mutate(consistent = +(n_distinct(charToRaw(type1)) == 1))


#  animal.ID type1     type2 type3 consistent
#      <int> <chr>     <chr> <chr>      <int>
#1         1 MMMMMMM   M     M              1
#2         2 MFMM      M     M              0
#3         3 FFM       F     F              0
#4         4 FFFFFFFFF F     F              1
#5         5 MM        M     M              1

数据

df <- structure(list(animal.ID = 1:5, type1 = c("MMMMMMM", "MFMM", 
"FFM", "FFFFFFFFF", "MM"), type2 = c("M", "M", "F", "F", "M"), 
type3 = c("M", "M", "F", "F", "M")), class = "data.frame", row.names = c(NA, -5L))
    
© www.soinside.com 2019 - 2024. All rights reserved.