![](/img/trans.png)
[英]R new column (variable) that rowSums across lists with NULL values
[英]Comparing column values with 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 列:一列用於單胞胎(當每個數字只出現一次時),一列用於雙胞胎,一列用於三胞胎(如果任何數字出現 3 次),一列用於四胞胎。
我正在使用 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
雙胞胎相同的值,請改用 function
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.