删除 R 中方差为零的行
Remove rows with zero-variance in R
我有一个调查回复数据框(行 = 参与者,列 = 问题回复)。参与者将以 5 分李克特量表回答 50 个问题。我想删除在 50 个问题中回答 5 个的参与者,因为他们的方差为零并且可能会影响我的结果。
我看过 nearZeroVar() 函数,但想知道在 base R 中是否有办法做到这一点?
非常感谢,
R
假设您有这样的数据。
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 的行。
如果你有这个数据框:
df <- data.frame(col1 = rep(1, 10),
col2 = 1:10,
col3 = rep(1:2, 5))
您可以计算每列的方差,并且 select 仅计算那些方差不是 0
或大于或等于某个接近于 [=14= 的阈值的列] 会做:
df[, sapply(df, var) != 0]
df[, sapply(df, var) >= 0.3]
如果你想排除行,你可以做类似的事情,但是循环遍历行然后子集:
df[apply(df, 1, var) != 0, ]
df[apply(df, 1, var) >= 0.3, ]
# 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
窃取@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
.
的行
我有一个调查回复数据框(行 = 参与者,列 = 问题回复)。参与者将以 5 分李克特量表回答 50 个问题。我想删除在 50 个问题中回答 5 个的参与者,因为他们的方差为零并且可能会影响我的结果。
我看过 nearZeroVar() 函数,但想知道在 base R 中是否有办法做到这一点?
非常感谢,
R
假设您有这样的数据。
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 的行。
如果你有这个数据框:
df <- data.frame(col1 = rep(1, 10),
col2 = 1:10,
col3 = rep(1:2, 5))
您可以计算每列的方差,并且 select 仅计算那些方差不是 0
或大于或等于某个接近于 [=14= 的阈值的列] 会做:
df[, sapply(df, var) != 0]
df[, sapply(df, var) >= 0.3]
如果你想排除行,你可以做类似的事情,但是循环遍历行然后子集:
df[apply(df, 1, var) != 0, ]
df[apply(df, 1, var) >= 0.3, ]
# 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
窃取@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
.