如何编写 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。
我想创建一个二分变量来告诉我参与者是否对 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。