r语言 - 将列值与rowsum进行比较



我正在尝试使用rowsum,但使用对条件值的比较。

这是一个基于调查的数据框架的例子。其中行表示参与者,列表示孩子的出生日期。

b3_01 b3_02 b3_03 b3_04 b3_05 b3_06
1  1360  1360  1266  1228  1181  1158    
2  1362  1342  1301  1264  1245  1191 
3  1379    NA    NA    NA    NA    NA  
4  1355  1330  1293  1293  1227  1208  
5  1391  1371  1358  1334  1311  1311

这里,相似的日期指的是双胞胎。我要做的是创建一个新列,它告诉我,对于每一行,这些列的值相似的次数。它会给我这样的东西:

b3_01 b3_02 b3_03 b3_04 b3_05 b3_06 twins
1  1360  1360  1266  1228  1181  1158     1
2  1362  1342  1301  1264  1245  1191     0
3  1379    NA    NA    NA    NA    NA     0
4  1355  1330  1293  1293  1227  1208     1
5  1391  1371  1358  1334  1311  1311     1

编辑:对不起,我忘了说,如果任何数字出现3次或更多次,它不应该被算作双胞胎。最终目标是有4列:一列用于单胞胎(每个数字只出现一次),一列用于双胞胎,一列用于三胞胎(如果任何数字出现三次),一列用于四胞胎。

我和dplyr一起工作。由于data.frame非常大,我需要指定要进行比较的列的范围。我尝试了以下代码,以及变体:

twins<-df%>%
mutate(twins= rowSums(select(.,starts_with("b3_")) == select(.,starts_with("b3_")),na.rm=TRUE))

不起作用。我也试过其他的函数,但没有找到解决方案。

你知道如何实现这一点吗?我觉得解决方案很简单,但我是r的绝对初学者。

一个简单的解决方案是

twins <- df%>%
mutate(twins = apply(., 1, function(x) sum(duplicated(x, incomparables=NA))))

参考我的评论并假设一行中的n相同值被计数为n-1双胞胎,定义

countTwins <- function(row) {
length(row)-length(unique(row))
}

得到列twins

twinCol <- apply(df,1,countTwins)

如果您想将n的值与1的值相同,请使用

函数
countTwins2 <- function(row) {
sum(table(unname(unlist(row)))>1)
}

根据我的评论更新:

countSinglesTwinsAndTriplets <- function(row) {
tt <- table(unname(unlist(row)))
c(sum(tt==1),sum(tt==2),sum(tt==3)) #nr of singletons,twins,triplets
}
addCols <- setNames(data.frame(t(apply(df,1,countSinglesTwinsAndTriplets))),c("singletons","twins","triplets"))

附加方案

df$twins <- apply(df, 1, function(x) length(x) - length(unique(x)) - sum(is.na(x)) + any(is.na(x)))
b3_01 b3_02 b3_03 b3_04 b3_05 b3_06 twins
1  1360  1360  1266  1228  1181  1158     1
2  1362  1342  1301  1264  1245  1191     0
3  1379    NA    NA    NA    NA    NA     0
4  1355  1330  1293  1293  1227  1208     1
5  1391  1371  1358  1334  1311  1311     1

与@Taufi使用的逻辑类似,但增加了purrr:

df %>%
mutate(twins = pmap(across(everything()), ~ sum(duplicated(na.omit(c(...))))))
b3_01 b3_02 b3_03 b3_04 b3_05 b3_06 twins
1  1360  1360  1266  1228  1181  1158     1
2  1362  1342  1301  1264  1245  1191     0
3  1379    NA    NA    NA    NA    NA     0
4  1355  1330  1293  1293  1227  1208     1
5  1391  1371  1358  1334  1311  1311     1

相关内容

  • 没有找到相关文章

最新更新