如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是否具有相同的值

How can I write an R script to check for straight-lining; i.e., whether, for any given row, all values in a set of columns have the same value

我想创建一个二分变量来告诉我参与者是否对 10 个问题中的每一个都给出了相同的回答。每行都是一个参与者,我想编写一个简单的脚本来在我的数据框中创建这个新的 variable/vector。例如,如果我的数据看起来像前 6 列,那么我正在尝试创建第 7 列。

ID   Item1  Item2  Item3  Item4  Item5  | AllSame
1    5      5      5      5      5      | Yes
2    1      3      3      3      2      | No
3    2      2      2      2      2      | Yes
4    5      4      5      5      5      | No
5    5      2      3      5      5      | No

我在这个集合中看到了将一列与另一列进行比较的解决方案,例如此处的 ifelse(data$item1==data$item2,1,ifelse(dat$item1==data$item3,0,NA)),但我的实际数据集中有 10 列,我认为必须有比相互检查所有 10 个。我还可以创建一个变量来计算有多少等于 1,然后测试计数是否与列数相同,但是数据中有 7 种可能的响应,这看起来非常笨拙,我是希望有人有更好的解决方案。谢谢!

有很多方法可以做到这一点,但这里只有一种

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
                   Item2 = c(5,3,2,4,2), 
                   Item3 = c(5,3,2,5,3), 
                   Item4 = c(5,3,2,5,5),
                   Item5 = c(5,3,2,5,5) )

mydf$AllSame <- rowMeans(mydf[,1:5] == mydf[,1]) == 1

这导致

> mydf
  Item1 Item2 Item3 Item4 Item5 AllSame
1     5     5     5     5     5    TRUE
2     1     3     3     3     3   FALSE
3     2     2     2     2     2    TRUE
4     5     4     5     5     5   FALSE
5     5     2     3     5     5   FALSE

如果你真的必须有 "Yes" 和 "No" 然后使用像

这样的东西
mydf$AllSame <- ifelse(rowMeans(mydf[,1:5] == mydf[,1]) == 1, "Yes", "No")

Henry 发布了一个简短而快速的工作解决方案,该解决方案已被接受。我仍然想添加这个替代方案,我认为它在可读性方面略有优势:

mydf <- data.frame(Item1 = c(5,1,2,5,5), 
                   Item2 = c(5,3,2,4,2), 
                   Item3 = c(5,3,2,5,3), 
                   Item4 = c(5,3,2,5,5),
                   Item5 = c(5,3,2,5,5) )

mydf$AllSame <- apply(mydf, 1, function(row) all(row==row[1]))

此处使用的 all() 函数有一个 na.rm 参数,如果您希望忽略 NA,可以轻松将其设置为 TRUE。