将列值与 rowSums

问题描述

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

这是我的数据框示例,基于调查。行代表参与者,列代表孩子的出生日期。

  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,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,countSinglesTwinsAndTriplets))),c("singletons","twins","triplets"))
,

其他解决方案

基础

df$twins <- apply(df,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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...