【问题标题】:Testing whether values across multiple columns are the same using dplyr使用 dplyr 测试跨多列的值是否相同
【发布时间】:2018-05-16 21:43:27
【问题描述】:

我在数据框中有一些列是字符变量。下面给出了我感兴趣的列的两行示例:

a <- rep('Agree', 20)
b <- rep(c('Disagree', 'Agree'), 10)
dat <- data.frame(rbind(a,b), stringsAsFactors = FALSE)

我想识别每列具有相同值的所有行。例如,使用 dplyr mutate,我想创建一个名为“allSame”的新变量,其中“dat”第一行的值为“yes”,第二行的值为“no”。

我还想按数字而不是名称来索引列,因为一些变量的名称很长,并且我想为数据框中的多组列进行此操作。

【问题讨论】:

  • dat 是一个矩阵,而不是一个数据框。您打算使用哪个类?如果要使用数据框,dat &lt;- data.frame(a = a, b = b, stringsAsFactors = FALSE) 是创建数据框的一种方式。
  • @jazzurro 感谢您指出这个错误,我已经编辑以澄清我正在使用数据框
  • 您现在拥有多种格式的数据。所以你有 20 列。这是正确的吗?
  • 是的,数据是宽格式的。 20 列就是一个例子,我想在数据中使用多组列。

标签: r dplyr


【解决方案1】:

以下是检查您是否有相同答案的一种方法(即全部同意或全部不同意)。我创建了一个最小的示例并执行了以下操作。您想检查每一行是否只有“同意”或“不同意”。您可以使用逻辑检查。 mydf == "Agree" 返回一个包含 T 或 F 的矩阵。使用 rowSums(),您可以计算每行中有多少次 T。如果结果等于 ncol(mydf),在这种情况下为 3,则您只有“同意”。如果你有 0,你只有“不同意”。我猜你想要这些案例是肯定的。 allSame 中的 TRUE 表示是。

mydf <- data.frame(col1 = c("Agree", "Agree", "Disagree"),
                   col2 = c("Agree", "Disagree", "Disagree"),
                   col3 = c("Agree", "Disagree", "Disagree"),
                   stringsAsFactors = FALSE)

#      col1     col2     col3
#1    Agree    Agree    Agree
#2    Agree Disagree Disagree
#3 Disagree Disagree Disagree

mydf %>%
mutate(allSame = (rowSums(mydf == "Agree") == 0 |
                  rowSums(mydf == "Agree") == ncol(mydf)))

#      col1     col2     col3 allSame
#1    Agree    Agree    Agree    TRUE
#2    Agree Disagree Disagree   FALSE
#3 Disagree Disagree Disagree    TRUE

鉴于上述情况,您会这样做:

dat %>%
mutate(allSame = (rowSums(dat == "Agree") == 0 |
                  rowSums(dat == "Agree") == ncol(dat)))

【讨论】:

    【解决方案2】:

    如果您想独立地遍历每一行,请使用sapply。可能值得查找functionals

    a <- rep('Agree', 20)
    b <- rep(c('Disagree', 'Agree'), 10)
    df <- data.frame(a, b, stringsAsFactors =F)
    
    
    df <- mutate(df, same = sapply(1:nrow(df), function(i){
      if(a[i] == b[i]){'yes'} else {'no'}
    }))
    

    重命名应该使用names

    names(df) <- paste0('index_', 1:length(names(df))
    

    【讨论】:

    • 恐怕你的df只有两列。根据 OP,这是不正确的。
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多