如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值
Posted
技术标签:
【中文标题】如何编写 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如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是否具有相同的值 【发布时间】:2016-10-25 03:12:21 【问题描述】:我想创建一个二分变量,告诉我参与者是否对 10 个问题中的每一个问题都给出了相同的回答。每行都是一个参与者,我想编写一个简单的脚本来在我的数据框中创建这个新的变量/向量。例如,如果我的数据看起来像前 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 个可能的响应,这看起来非常笨拙,我希望有人有更好的解决方案。谢谢!
【问题讨论】:
在***上可能更好,因为这是编程而不是统计 如果一行中有所有“NA”值,你希望它如何表现? Test for equality among all elements of a single vector的可能重复 你应该把你的表变成一个最小的可重现的例子。 是的,这似乎更有意义,谢谢。并且 Glen_b 那里有一些解决方案,感谢您的参考。至于所有 NA 的列,我希望它最终成为 NA。我使用了亨利下面的解决方案 - 会这样做吗?这似乎来自我的代码,因为对于我希望完全空白的数字,我有大约正确数量的 NA。 【参考方案1】:有很多方法可以做到这一点,但这里有一个
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
如果你真的必须有“是”和“否”,那么请改用类似
mydf$AllSame <- ifelse(rowMeans(mydf[,1:5] == mydf[,1]) == 1, "Yes", "No")
【讨论】:
这行得通,我只是想了解一下,谢谢!我根本不需要是和否,但自从您发布该脚本后,我将其更改为 1 和 0,因为这将使分析更容易。请注意以后发现此问题的任何人,以避免我最初遇到的问题:== mydf[,1]
处的数字应该是您正在查看的第一列;我将其保留为 1,因为我不知道它在做什么,而且我的所有响应一开始都是 0。例如。我的最终代码是data$SL_set1<- ifelse(rowMeans(data[,28:37] == data[,28]) == 1, 1, 0)
我试图弄清楚这个公式是如何工作的,所以我理解它仍然足以修改它,例如对于字符串变量(我认为这做不到)或丢失数据。是否检查 5 列的平均值是否与第一列的值相同?如果平均值恰好与第一个相同,那会是一个问题吗?我猜不是因为这会导致很多误报,但我不明白这个公式是如何工作的。如果行中没有 NA,我也只希望它为 TRUE,所以我想我需要在某处添加 na.omit。
它检查指定列的行中的所有值是否都等于指定列中的对应值(如果相等则取一组TRUE的平均值,即$1$s ,在该行中,如果它们都是 TRUE,则该平均值为 1)。它适用于字符串变量,只要它们是 not 因素。如果连续有 NA,则给出 NA 而不是 TRUE 或 FALSE。【参考方案2】:
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。
【讨论】:
以上是关于如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 编写一个函数来检查给定字符串是否与给定模式匹配为非连续子字符串:即,模式中的所有字符