删除R中零差异的行

时间:2018-04-24 15:37:08

标签: r data-cleaning survey

我有调查回复的数据框(行=参与者,列=问题回复)。参与者将以5分的李克特量表回答50个问题。我希望删除那些在50个问题中回答5的参与者,因为他们的方差为零,可能会影响我的结果。

我已经看过了nearZeroVar()函数,但是想知道在基数R中是否有办法做到这一点?

非常感谢,

[R

4 个答案:

答案 0 :(得分:0)

假设你有这样的数据。

survey <- data.frame(participants = c(1:10),
                     q1 = c(1,2,5,5,5,1,2,3,4,2), 
                     q2 = c(1,2,5,5,5,1,2,3,4,3), 
                     q3 = c(3,2,5,4,5,5,2,3,4,5))

您可以执行以下操作。

idx <- which(apply(survey[,-1], 1, function(x) all(x == 5)) == T)
survey[-idx,]

这将删除所有值等于5的行。

答案 1 :(得分:0)

如果你有这个数据帧:

df <- data.frame(col1 = rep(1, 10),
                 col2 = 1:10,
                 col3 = rep(1:2, 5))

您可以计算每列的方差,并仅选择方差不是0或大于或等于特定阈值的那些列,该阈值接近nearZeroVar()将执行的操作:

df[, sapply(df, var) != 0]
df[, sapply(df, var) >= 0.3]

如果你想排除行,你可以做类似的事情,但是循环遍历行然后子集:

df[apply(df, 1, var) != 0, ]
df[apply(df, 1, var) >= 0.3, ]

答案 2 :(得分:0)

# Dummy data:
df <- data.frame(
  matrix(
    sample(1:5, 100000, replace =TRUE), 
    ncol = 5
  )
)
names(df) <- paste0("likert", 1:5)
df$id <- 1:nrow(df)
head(df)
  likert1 likert2 likert3 likert4 likert5 id
1       1       2       4       4       5  1
2       5       4       2       2       1  2
3       2       1       2       1       5  3
4       5       1       3       3       2  4
5       4       3       3       5       1  5
6       1       3       3       2       3  6
dim(df)
[1] 20000     6

# Clean out rows where all likert values are 5
df <- df[rowSums(df[grepl("likert", names(df))] == 5) != 5, ]
nrow(df)
[1] 19995

答案 3 :(得分:0)

窃取@ AshOfFire的数据,只需稍加修改就像你说你只有列中的答案而不是参与者:

survey <- data.frame(q1 = c(1,2,5,5,5,1,2,3,4,2), 
                     q2 = c(1,2,5,5,5,1,2,3,4,3), 
                     q3 = c(3,2,5,4,5,5,2,3,4,5))

survey[!apply(survey==survey[[1]],1,all),]

#    q1 q2 q3
# 1   1  1  3
# 4   5  5  4
# 6   1  1  5
# 10  2  3  5

相等测试构建一个填充了布尔值的data.frame,然后通过应用我们保留的行不会始终TRUE