[英]How can I remove all rows of a dataframe that have the same string value across a subset of columns in R?
我有一個 dataframe,看起來像這樣:
ID | 時間 | Q1 | Q2 | Q3 | 第四季度 |
---|---|---|---|---|---|
1個 | 2分鍾 | 同意 | 北美 | 中性的 | 北美 |
2個 | 5分鍾 | 北美 | 不同意 | 同意 | 北美 |
3個 | 3分鍾 | 同意 | 北美 | 中性的 | 北美 |
4個 | 5分鍾 | 不同意 | 不同意 | 北美 | 北美 |
5個 | 6分鍾 | 北美 | 同意 | 同意 | 同意 |
6個 | 1分鍾 | 北美 | 北美 | 北美 | 北美 |
我只想保留對問題的回答在問題列 (Q1:Q4) 中不相等的行。 在此示例中,我將保留 ID 1-3 的行並刪除 4-6 行,因為它們都是相同的字符串。 我確實想保留前兩列的信息,但我不想在關於是否保留該行的決策邏輯中使用它。 所有行都有 NA,但 NA 位於不同的位置 - 所以我想刪除其中具有任何值的所有列都相同的行,或者刪除跨列的所有值都丟失的行。
我找到了另一個做了類似事情的答案並嘗試了這個:
keep <- apply(df[3:6], 1, function(x) length(unique(x[!is.na(x)])) != 1)
df[keep, ]
但這似乎只刪除了所有 NA 的行。
這是一個基於 dplyr 的解決方案:使用rowwise()
進行分組,然后過濾到跨列具有 > 1 個不同值的行。
library(dplyr)
df %>%
rowwise() %>%
filter(n_distinct(c_across(Q1:Q4), na.rm = TRUE) > 1) %>%
ungroup()
# A tibble: 3 × 6
ID Time Q1 Q2 Q3 Q4
<int> <chr> <chr> <chr> <chr> <chr>
1 1 2min Agree NA Neutral NA
2 2 5min NA Disagree Agree NA
3 3 3min Agree NA Neutral NA
data <- data.frame(ID = 1:6, Time = c("2 min", "5 min", "3 min", "5 min", "6 min", "1 min"), Q1 = c("Agree", NA, "Agree", "Disagree", NA, NA), Q2 = c(NA, "Disagree", NA, "Disagree", "Agree", NA), Q3 = c("Neutral", "Agree", "Neutral", NA, "Agree", NA), Q4 = c(NA, NA, NA, NA, "Agree", NA)) rows <- apply(data[3:6], 1, \(x) all(x[!is.na(x)][1] == x[!is.na(x)][-1]) ) data[!rows,] #> ID Time Q1 Q2 Q3 Q4 #> 1 1 2 min Agree <NA> Neutral <NA> #> 2 2 5 min <NA> Disagree Agree <NA> #> 3 3 3 min Agree <NA> Neutral <NA>
為了保留所有具有相同響應的人(假設忽略NA
s),您可以在您嘗試的代碼中嘗試這個輕微的變化:
keeps <- apply(df[3:6], 1, function(x) length(unique(x[!is.na(x)])) == 1)
df[keeps, ]
# ID Time Q1 Q2 Q3 Q4
# 4 5 min Disagree Disagree <NA> <NA>
# 5 6 min <NA> Agree Agree Agree
如果您想要所有沒有相同響應的人(假設忽略NA
s):
keeps <- apply(df[3:6], 1, function(x) length(unique(x[!is.na(x)])) != 1 & !all(is.na(x)))
df[keeps, ]
# ID Time Q1 Q2 Q3 Q4
# 1 2 min Agree <NA> Neutral <NA>
# 2 5 min <NA> Disagree Agree <NA>
# 3 3 min Agree <NA> Neutral <NA>
數據
df <- read.table(text = "ID Time Q1 Q2 Q3 Q4
1 2 min Agree NA Neutral NA
2 5 min NA Disagree Agree NA
3 3 min Agree NA Neutral NA
4 5 min Disagree Disagree NA NA
5 6 min NA Agree Agree Agree
6 1 min NA NA NA NA", header = TRUE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.