簡體   English   中英

將列值與 rowSums 進行比較

[英]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)

如果您想計算n1雙胞胎相同的值,請改用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM