如何删除 Dataframe 中在R的列子集上具有相同字符串值的所有行?

sulc1iza  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(140)

我有一个 Dataframe ,看起来像这样:
| 识别号|时间|第一季度|第二季度|第三季度|第四季度|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|2分钟|同意|不适用|中性|不适用|
| 第二章|5分钟|不适用|不同意|同意|不适用|
| 三个|3分钟|同意|不适用|中性|不适用|
| 四个|5分钟|不同意|不同意|不适用|不适用|
| 五个|6分钟|不适用|同意|同意|同意|
| 六个|1分钟|不适用|不适用|不适用|不适用|
我只想保留在“问题”列(Q1:Q4)中对问题的响应不相等的行。在本例中,我将保留ID 1-3的行,删除ID 4-6的行,因为它们都是相同的字符串。我确实想保留前两列中的信息,但不想在有关是否保留该行的决策逻辑中使用它。所有行都有NA,但NA位于不同的位置-因此,我想删除其中具有任何值的所有列都相同的行,或跨列的所有值都缺失的行。
我找到了另一个类似的答案,并尝试了以下方法:

keep <- apply(df[3:6], 1, function(x) length(unique(x[!is.na(x)])) != 1)
df[keep, ]

但这似乎只删除了全是NA的行。

km0tfn4u

km0tfn4u1#

要保留所有响应不一致的代码(假设忽略NA s),可以尝试在代码中做以下细微更改:

keeps <- apply(df[3:6], 1, function(x) !length(unique(x[!is.na(x)])) %in% 0:1)
df[keeps, ]

#    ID Time    Q1       Q2      Q3   Q4
# 1  1 2min Agree     <NA> Neutral <NA>
# 2  2 5min  <NA> Disagree   Agree <NA>
# 3  3 3min 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  4 5min Disagree Disagree  <NA>  <NA>
# 5  5 6min     <NA>    Agree Agree Agree

数据类型

df <- read.table(text = "ID Time    Q1  Q2  Q3  Q4
1   2min    Agree   NA  Neutral NA
2   5min    NA  Disagree    Agree   NA
3   3min    Agree   NA  Neutral NA
4   5min    Disagree    Disagree    NA  NA
5   6min    NA  Agree   Agree   Agree
6   1min    NA  NA  NA  NA", header = TRUE)
wf82jlnq

wf82jlnq2#

下面是一个基于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
lrpiutwd

lrpiutwd3#

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>

相关问题