将特定值保留在数据框中并删除所有其他值
Keep specific values in a dataframe and delete all the others
从这样的数据框开始:
col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )
df <- cbind(col1, col2, col3)
我只想保留此向量中报告的值:
selected <- c("Emma", "Katy", "Mark")
并删除所有其他的,以便有一个像这样的新数据框:
col1 col2 col3
NA NA "Mark"
"Emma" "Mark" "Emma"
"Katy" NA NA
NA NA NA
NA NA NA
我已经尝试使用以下代码并且有效:
df[df != "Emma" & df != "Katy" & df != "Mark"] <- NA
但我想找到一种在 if 语句中使用向量 selected
的方法,而不是手动编写所有条件。
事实上,我的实际数据框和值向量比这个例子中的要大。
在此先感谢您的帮助!
问题中的代码使用 cbind
创建了一个矩阵,而不是 data.frame。这很重要,因为 df 是具有暗淡属性集的所有相同长度的向量列表,而矩阵是折叠向量,具有暗淡属性集的向量。
- 对于 data.frames,在其列上使用循环,对每一列应用函数
'%in%'
;
- 对于矩阵,不需要循环。
col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )
mat <- cbind(col1, col2, col3)
df <- data.frame(col1, col2, col3)
selected <- c("Emma", "Katy", "Mark")
is.na(df) <- !sapply(df, `%in%`, selected)
df
#> col1 col2 col3
#> 1 <NA> <NA> Mark
#> 2 Emma Mark Emma
#> 3 Katy <NA> <NA>
#> 4 <NA> <NA> <NA>
#> 5 <NA> <NA> <NA>
is.na(mat) <- !mat %in% selected
mat
#> col1 col2 col3
#> [1,] NA NA "Mark"
#> [2,] "Emma" "Mark" "Emma"
#> [3,] "Katy" NA NA
#> [4,] NA NA NA
#> [5,] NA NA NA
由 reprex package (v2.0.1)
于 2022-03-20 创建
从这样的数据框开始:
col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )
df <- cbind(col1, col2, col3)
我只想保留此向量中报告的值:
selected <- c("Emma", "Katy", "Mark")
并删除所有其他的,以便有一个像这样的新数据框:
col1 col2 col3
NA NA "Mark"
"Emma" "Mark" "Emma"
"Katy" NA NA
NA NA NA
NA NA NA
我已经尝试使用以下代码并且有效:
df[df != "Emma" & df != "Katy" & df != "Mark"] <- NA
但我想找到一种在 if 语句中使用向量 selected
的方法,而不是手动编写所有条件。
事实上,我的实际数据框和值向量比这个例子中的要大。
在此先感谢您的帮助!
问题中的代码使用 cbind
创建了一个矩阵,而不是 data.frame。这很重要,因为 df 是具有暗淡属性集的所有相同长度的向量列表,而矩阵是折叠向量,具有暗淡属性集的向量。
- 对于 data.frames,在其列上使用循环,对每一列应用函数
'%in%'
; - 对于矩阵,不需要循环。
col1 <- c("Anne", "Emma", "Katy", "Albert", "Richard")
col2 <- c("Albert", "Mark", "Mike", "Loren", "Anne")
col3 <- c("Mark", "Emma", "Paul", "George", "Samuel" )
mat <- cbind(col1, col2, col3)
df <- data.frame(col1, col2, col3)
selected <- c("Emma", "Katy", "Mark")
is.na(df) <- !sapply(df, `%in%`, selected)
df
#> col1 col2 col3
#> 1 <NA> <NA> Mark
#> 2 Emma Mark Emma
#> 3 Katy <NA> <NA>
#> 4 <NA> <NA> <NA>
#> 5 <NA> <NA> <NA>
is.na(mat) <- !mat %in% selected
mat
#> col1 col2 col3
#> [1,] NA NA "Mark"
#> [2,] "Emma" "Mark" "Emma"
#> [3,] "Katy" NA NA
#> [4,] NA NA NA
#> [5,] NA NA NA
由 reprex package (v2.0.1)
于 2022-03-20 创建