将列值与 rowSums 进行比较
Comparing column values with rowSums
我正在尝试使用 rowSums,但使用的是对条件值的比较。
这是我的数据框示例,基于调查。其中行指的是参与者,列指的是 child.
的出生日期
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
我正在尝试使用 rowSums,但使用的是对条件值的比较。
这是我的数据框示例,基于调查。其中行指的是参与者,列指的是 child.
的出生日期 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