假设我创建了以下数据框:
set.seed(215)
df <- data.frame(names = rep(letters[1:3], 4),
class = sample(c("x","y","z"), 12, replace = TRUE))
字符串
这将生成以下 Dataframe :
df
names class
1 a z
2 b z
3 c x
4 a x
5 b y
6 c x
7 a x
8 b z
9 c y
10 a y
11 b z
12 c x
型
我想折叠行,使name
和class
的每个组合只出现一次。在上面的示例数据中,我会有这样的:
df2
names class
1 a z
2 a x
3 a y
4 b z
5 b y
6 c x
7 c y
型
我试过:
new_df <- df %>%
tidyr::pivot_wider(., names_from = names, values_from = class) %>%
tibble::rownames_to_column() %>%
pivot_longer(-rowname) %>%
pivot_wider(names_from=rowname, values_from=value) %>%
as.data.frame()
型
但是,这会导致以下警告消息:
Warning message:
Values from `class` are not uniquely identified; output will contain list-cols.
• Use `values_fn = list` to suppress this warning.
• Use `values_fn = {summary_fun}` to summarise duplicates.
• Use the following dplyr code to identify duplicates.
{data} %>%
dplyr::group_by(names) %>%
dplyr::summarise(n = dplyr::n(), .groups = "drop") %>%
dplyr::filter(n > 1L)
型
生成的df看起来像这样:
name 1
1 a z, x, x, y
2 b z, y, z, z
3 c x, x, y, x
型
请帮助我确定最简单的方法来做到这一点。我正试图用base R或tidyverse找出一个解决方案,但我很感激任何帮助。
谢谢你,谢谢
- 编辑以纠正所需结果的格式。
1条答案
按热度按时间kmpatx3s1#
如注解中所述,最简单的方法是
unique(df)
或distinct(df)
(两者给予相同的结果)。