R:将以下代码转换为 DPLYR
R: Converting the Following Code to DPLYR
我正在使用 R 编程语言。我有以下 table:
age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)
head(testframe)
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
在上面的 table 中,我想删除具有相同条目但名称不同的列。这可以按如下方式完成(在 Base R 中):
no_dup = testframe[!duplicated(as.list(testframe))]
head(no_dup)
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题:有谁知道如何将上面的代码testframe[!duplicated(as.list(testframe))
转换成“DPLYR”命令?这可能吗?
谢谢!
这是一个使用 tidyverse
的选项。我使用 purrr::map
将每一列转换为一个列表,然后我找到了没有重复的列表。对于 dplyr::select
,您不能使用逻辑向量,因此我们只能使用 which
到 return 的 TRUE
列(即,不重复)。然后,我们可以使用索引值来 select 列。
library(tidyverse)
testframe %>%
dplyr::select(., which(purrr::map(., c) %>%
duplicated(.) %>%
`!`))
输出
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
7 24 79.9 M
8 25 81.1 M
9 26 81.2 F
10 27 81.8 M
11 28 82.8 F
12 29 83.5 M
你也可以不用 purrr
。
testframe %>%
dplyr::select(., which(as.list(.) %>%
duplicated %>%
`!`))
只是为了好玩,这里我只使用tidyverse
(虽然更冗长)。它还需要多次旋转数据框。
testframe %>%
tibble::rownames_to_column() %>%
dplyr::mutate_all(as.character) %>%
tidyr::pivot_longer(-rowname) %>%
tidyr::pivot_wider(names_from = rowname, values_from = value) %>%
dplyr::distinct_at(vars(-name), .keep_all = TRUE) %>%
tidyr::pivot_longer(-name, names_to = "rowname", values_to = "value") %>%
tidyr::pivot_wider(names_from = name, values_from = value) %>%
dplyr::select(-rowname)
数据
testframe <-
structure(
list(
age = 18:29,
height = c(76.1, 77, 78.1, 78.2,
78.8, 79.7, 79.9, 81.1, 81.2, 81.8, 82.8, 83.5),
height2 = c(76.1,
77, 78.1, 78.2, 78.8, 79.7, 79.9, 81.1, 81.2, 81.8, 82.8, 83.5),
gender = c("M", "F", "M", "M", "F", "F", "M", "M", "F", "M",
"F", "M"),
gender2 = c("M", "F", "M", "M", "F", "F", "M", "M",
"F", "M", "F", "M")
),
class = "data.frame",
row.names = c(NA, -12L)
)
我正在使用 R 编程语言。我有以下 table:
age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)
head(testframe)
age height height2 gender gender2
1 18 76.1 76.1 M M
2 19 77.0 77.0 F F
3 20 78.1 78.1 M M
4 21 78.2 78.2 M M
5 22 78.8 78.8 F F
6 23 79.7 79.7 F F
在上面的 table 中,我想删除具有相同条目但名称不同的列。这可以按如下方式完成(在 Base R 中):
no_dup = testframe[!duplicated(as.list(testframe))]
head(no_dup)
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
我的问题:有谁知道如何将上面的代码testframe[!duplicated(as.list(testframe))
转换成“DPLYR”命令?这可能吗?
谢谢!
这是一个使用 tidyverse
的选项。我使用 purrr::map
将每一列转换为一个列表,然后我找到了没有重复的列表。对于 dplyr::select
,您不能使用逻辑向量,因此我们只能使用 which
到 return 的 TRUE
列(即,不重复)。然后,我们可以使用索引值来 select 列。
library(tidyverse)
testframe %>%
dplyr::select(., which(purrr::map(., c) %>%
duplicated(.) %>%
`!`))
输出
age height gender
1 18 76.1 M
2 19 77.0 F
3 20 78.1 M
4 21 78.2 M
5 22 78.8 F
6 23 79.7 F
7 24 79.9 M
8 25 81.1 M
9 26 81.2 F
10 27 81.8 M
11 28 82.8 F
12 29 83.5 M
你也可以不用 purrr
。
testframe %>%
dplyr::select(., which(as.list(.) %>%
duplicated %>%
`!`))
只是为了好玩,这里我只使用tidyverse
(虽然更冗长)。它还需要多次旋转数据框。
testframe %>%
tibble::rownames_to_column() %>%
dplyr::mutate_all(as.character) %>%
tidyr::pivot_longer(-rowname) %>%
tidyr::pivot_wider(names_from = rowname, values_from = value) %>%
dplyr::distinct_at(vars(-name), .keep_all = TRUE) %>%
tidyr::pivot_longer(-name, names_to = "rowname", values_to = "value") %>%
tidyr::pivot_wider(names_from = name, values_from = value) %>%
dplyr::select(-rowname)
数据
testframe <-
structure(
list(
age = 18:29,
height = c(76.1, 77, 78.1, 78.2,
78.8, 79.7, 79.9, 81.1, 81.2, 81.8, 82.8, 83.5),
height2 = c(76.1,
77, 78.1, 78.2, 78.8, 79.7, 79.9, 81.1, 81.2, 81.8, 82.8, 83.5),
gender = c("M", "F", "M", "M", "F", "F", "M", "M", "F", "M",
"F", "M"),
gender2 = c("M", "F", "M", "M", "F", "F", "M", "M",
"F", "M", "F", "M")
),
class = "data.frame",
row.names = c(NA, -12L)
)