我有动物追踪数据,随着时间的推移,每只动物都遇到过,每次相遇时都记录了性别。共有三种类型的遭遇(类型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分成多列,但鉴于每个字符串中的字符数不同,我不知道该怎么做。
一种方法可能是使用strsplit
和unlist
,检查所有字符是否等于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
我们可以使用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))