【发布时间】:2021-08-15 06:41:36
【问题描述】:
我有一个如下所示的数据框:
| number | A | B | C | D |
|---|---|---|---|---|
| 0.3 | 0 | 1 | 0 | 1 |
| 0.4 | 1 | 1 | 1 | 0 |
我想要这个数据框:
| number | category |
|---|---|
| 0.3 | B |
| 0.3 | D |
| 0.4 | A |
| 0.4 | B |
| 0.4 | C |
有什么方法或功能可以帮助我做到这一点吗?
【问题讨论】:
我有一个如下所示的数据框:
| number | A | B | C | D |
|---|---|---|---|---|
| 0.3 | 0 | 1 | 0 | 1 |
| 0.4 | 1 | 1 | 1 | 0 |
我想要这个数据框:
| number | category |
|---|---|
| 0.3 | B |
| 0.3 | D |
| 0.4 | A |
| 0.4 | B |
| 0.4 | C |
有什么方法或功能可以帮助我做到这一点吗?
【问题讨论】:
你可以使用pivot_longer获取长格式数据,filter获取不为0的值。
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = -number,
names_to = 'category') %>%
filter(value != 0) %>%
select(-value)
# number category
# <dbl> <chr>
#1 0.3 B
#2 0.3 D
#3 0.4 A
#4 0.4 B
#5 0.4 C
数据
如果您以可重现的格式提供数据,则更容易提供帮助。
df <- structure(list(number = c(0.3, 0.4), A = 0:1, B = c(1L, 1L),
C = 0:1, D = 1:0), row.names = c(NA, -2L), class = "data.frame")
【讨论】:
这是另一种策略:
across 和case_when 的列赋值
.keep="unused" 的number 列
library(dplyr)
librayr(tidyr)
df %>%
mutate(across(A:D, ~case_when(. == 1 ~ as.numeric(number))), .keep="unused") %>%
pivot_longer(
cols = A:D,
names_to = "category",
values_to = "number"
) %>%
na.omit()
输出:
# A tibble: 5 x 2
category number
<chr> <dbl>
1 B 0.3
2 D 0.3
3 A 0.4
4 B 0.4
5 C 0.4
【讨论】: