簡體   English   中英

R:將以下代碼轉換為 DPLYR

[英]R: Converting the Following Code to DPLYR

我正在使用 R 編程語言。 我有下表:

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

在上表中,我想刪除具有相同條目但名稱不同的列。 這可以按如下方式完成(在 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來僅返回TRUE列(即不重復)。 然后,我們可以使用索引值到 select 列。

library(tidyverse)

testframe %>%
  dplyr::select(., which(purrr::map(., c) %>%
                           duplicated(.) %>%
                           `!`))

Output

   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 (雖然更冗長)。 它還需要多次旋轉 dataframe。

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)
  )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM