如何根据特定行的比较来消除变量
How to eleminate variables based on comparison of specific rows
我的数据包含十二行和超过 500 个变量
我只想保留第 9 行值 > 5* 第 10 行值的变量
数据示例:
Name ClassType Col1 Col2 Col3
---------------------------------------
A Class1 10 50 12
B Class2 7 20 12
C Class1 8 12 8
D Class1 9 14 17
E Class2 3 15 14
F Class2 10 15 16
G Class2 12 22 15
H Class1 10 28 10
I NA 50 10 30
J NA 8 5 2
我想要的结果:删除第 2 列,因为该列中第 9 行的值 < 5* 同一列第 10 行的值:
Name ClassType Col1 Col3
-------------------------------
A Class1 10 12
B Class2 7 12
C Class1 8 8
D Class1 9 17
E Class2 3 14
F Class2 10 16
G Class2 12 15
H Class1 10 10
I NA 50 30
J NA 8 2
我尝试了if条件,但没有给我很好的结果,但我想知道是否还有其他方法。
我试过的代码
data_4 <- as.data.frame(data_3[,1, drop=FALSE])
for (i in 2:640) {
a = as.numeric(data_3[9,i])
b = as.numeric(data_3[10,i])
print(b)
c = as.numeric(b*5)
if(a > c) {
data_4 <- cbind(data_4[, , drop=FALSE], data_3[ ,i,drop=FALSE])
}
谢谢
我们可以使用select
到select条件匹配的character
列和numeric
列——列的第9个元素大于5倍last
值
library(dplyr)
df1 <- df1 %>%
dplyr::select(where(is.character),
where(~ is.numeric(.x) && nth(., 9) > 5 * last(.) ))
-输出
df1
Name ClassType Col1 Col3
1 A Class1 10 12
2 B Class2 7 12
3 C Class1 8 8
4 D Class1 9 17
5 E Class2 3 14
6 F Class2 10 16
7 G Class2 12 15
8 H Class1 10 10
9 I <NA> 50 30
10 J <NA> 8 2
数据
df1 <- structure(list(Name = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J"), ClassType = c("Class1", "Class2", "Class1", "Class1",
"Class2", "Class2", "Class2", "Class1", NA, NA), Col1 = c(10L,
7L, 8L, 9L, 3L, 10L, 12L, 10L, 50L, 8L), Col2 = c(50L, 20L, 12L,
14L, 15L, 15L, 22L, 28L, 10L, 5L), Col3 = c(12L, 12L, 8L, 17L,
14L, 16L, 15L, 10L, 30L, 2L)), class = "data.frame", row.names = c(NA,
-10L))
另一种可能的解决方案,使用 janitor::remove_empty
,将删除所有 mutate
的列,然后再转换为 NA
的列:
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
Name = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"),
ClassType = c("Class1","Class2",
"Class1","Class1","Class2","Class2","Class2",
"Class1",NA,NA),
Col1 = c(10L, 7L, 8L, 9L, 3L, 10L, 12L, 10L, 50L, 8L),
Col2 = c(50L, 20L, 12L, 14L, 15L, 15L, 22L, 28L, 10L, 5L),
Col3 = c(12L, 12L, 8L, 17L, 14L, 16L, 15L, 10L, 30L, 2L)
)
df %>%
mutate(across(where(is.numeric), ~ if (nth(.,9)<5*nth(.,10)) {NA} else {.x})) %>%
janitor::remove_empty(which = "cols")
#> Name ClassType Col1 Col3
#> 1 A Class1 10 12
#> 2 B Class2 7 12
#> 3 C Class1 8 8
#> 4 D Class1 9 17
#> 5 E Class2 3 14
#> 6 F Class2 10 16
#> 7 G Class2 12 15
#> 8 H Class1 10 10
#> 9 I <NA> 50 30
#> 10 J <NA> 8 2
我的数据包含十二行和超过 500 个变量 我只想保留第 9 行值 > 5* 第 10 行值的变量
数据示例:
Name ClassType Col1 Col2 Col3
---------------------------------------
A Class1 10 50 12
B Class2 7 20 12
C Class1 8 12 8
D Class1 9 14 17
E Class2 3 15 14
F Class2 10 15 16
G Class2 12 22 15
H Class1 10 28 10
I NA 50 10 30
J NA 8 5 2
我想要的结果:删除第 2 列,因为该列中第 9 行的值 < 5* 同一列第 10 行的值:
Name ClassType Col1 Col3
-------------------------------
A Class1 10 12
B Class2 7 12
C Class1 8 8
D Class1 9 17
E Class2 3 14
F Class2 10 16
G Class2 12 15
H Class1 10 10
I NA 50 30
J NA 8 2
我尝试了if条件,但没有给我很好的结果,但我想知道是否还有其他方法。
我试过的代码
data_4 <- as.data.frame(data_3[,1, drop=FALSE])
for (i in 2:640) {
a = as.numeric(data_3[9,i])
b = as.numeric(data_3[10,i])
print(b)
c = as.numeric(b*5)
if(a > c) {
data_4 <- cbind(data_4[, , drop=FALSE], data_3[ ,i,drop=FALSE])
}
谢谢
我们可以使用select
到select条件匹配的character
列和numeric
列——列的第9个元素大于5倍last
值
library(dplyr)
df1 <- df1 %>%
dplyr::select(where(is.character),
where(~ is.numeric(.x) && nth(., 9) > 5 * last(.) ))
-输出
df1
Name ClassType Col1 Col3
1 A Class1 10 12
2 B Class2 7 12
3 C Class1 8 8
4 D Class1 9 17
5 E Class2 3 14
6 F Class2 10 16
7 G Class2 12 15
8 H Class1 10 10
9 I <NA> 50 30
10 J <NA> 8 2
数据
df1 <- structure(list(Name = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J"), ClassType = c("Class1", "Class2", "Class1", "Class1",
"Class2", "Class2", "Class2", "Class1", NA, NA), Col1 = c(10L,
7L, 8L, 9L, 3L, 10L, 12L, 10L, 50L, 8L), Col2 = c(50L, 20L, 12L,
14L, 15L, 15L, 22L, 28L, 10L, 5L), Col3 = c(12L, 12L, 8L, 17L,
14L, 16L, 15L, 10L, 30L, 2L)), class = "data.frame", row.names = c(NA,
-10L))
另一种可能的解决方案,使用 janitor::remove_empty
,将删除所有 mutate
的列,然后再转换为 NA
的列:
library(tidyverse)
df <- data.frame(
stringsAsFactors = FALSE,
Name = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"),
ClassType = c("Class1","Class2",
"Class1","Class1","Class2","Class2","Class2",
"Class1",NA,NA),
Col1 = c(10L, 7L, 8L, 9L, 3L, 10L, 12L, 10L, 50L, 8L),
Col2 = c(50L, 20L, 12L, 14L, 15L, 15L, 22L, 28L, 10L, 5L),
Col3 = c(12L, 12L, 8L, 17L, 14L, 16L, 15L, 10L, 30L, 2L)
)
df %>%
mutate(across(where(is.numeric), ~ if (nth(.,9)<5*nth(.,10)) {NA} else {.x})) %>%
janitor::remove_empty(which = "cols")
#> Name ClassType Col1 Col3
#> 1 A Class1 10 12
#> 2 B Class2 7 12
#> 3 C Class1 8 8
#> 4 D Class1 9 17
#> 5 E Class2 3 14
#> 6 F Class2 10 16
#> 7 G Class2 12 15
#> 8 H Class1 10 10
#> 9 I <NA> 50 30
#> 10 J <NA> 8 2