我在R中有以下数据框
df1 <- data.frame(
"ID" = c("A", "B", "A", "B"),
"Value" = c(1, 2, 5, 5),
"freq" = c(1, 3, 5, 3)
)
我希望获得以下数据框
Value freq ID
1 1 A
2 NA A
3 NA A
4 NA A
5 1 A
1 NA B
2 2 B
3 NA B
4 NA B
5 5 B
我尝试了以下代码
library(tidyverse)
df_new <- bind_cols(df1 %>%
select(Value, freq, ID) %>%
complete(., expand(.,
Value = min(df1$Value):max(df1$Value))),)
我得到以下输出
Value freq ID
<dbl> <dbl> <fct>
1 1 A
2 3 B
3 NA NA
4 NA NA
5 5 A
5 3 B
我请求某人帮助我。
答案 0 :(得分:3)
使用tidyr::full_seq
可以找到Value
的完整版本,但是nesting(full_seq(Value,1)
将返回错误:
错误:
by
不能包含RHS缺少的连接列full_seq(Value, 1)
所以我们需要添加一个名称,因此nesting(Value=full_seq(Value,1)
library(tidyr)
df1 %>% complete(ID, nesting(Value=full_seq(Value,1)))
# A tibble: 10 x 3
ID Value freq
<fct> <dbl> <dbl>
1 A 1. 1.
2 A 2. NA
3 A 3. NA
4 A 4. NA
5 A 5. 5.
6 B 1. NA
7 B 2. 3.
8 B 3. NA
9 B 4. NA
10 B 5. 3.
答案 1 :(得分:2)
使用data.table
:
library(data.table)
setDT(df1)
setkey(df1, ID, Value)
df1[CJ(ID = c("A", "B"), Value = 1:5)]
ID Value freq
1: A 1 1
2: A 2 NA
3: A 3 NA
4: A 4 NA
5: A 5 5
6: B 1 NA
7: B 2 3
8: B 3 NA
9: B 4 NA
10: B 5 3
答案 2 :(得分:1)
以下方法对您有用吗?
with(data = df1,
expr = {
data.frame(Value = rep(wrapr::seqi(min(Value), max(Value)), length(unique(ID))),
ID = unique(ID))
}) %>%
left_join(y = df1,
by = c("ID" = "ID", "Value" = "Value")) %>%
arrange(ID, Value)
Value ID freq
1 1 A 1
2 2 A NA
3 3 A NA
4 4 A NA
5 5 A 5
6 1 B NA
7 2 B 3
8 3 B NA
9 4 B NA
10 5 B 3
ID
组的取值范围是1到5。如果是这种情况,我的方法是生成读取的唯一组合都来自原始数据帧。freq
,该变量可能/可能不适用于给定的标准 ID-Value
。我将通过left_join
(您似乎喜欢tidyverse
)加入该变量
freq
变量,其值分别为1,3,5,但是在示例中,您列出了1,2,5?在我的示例中,我选择了原始的 freq
并退出了。如果您打算这样做,则可以使用普通的dplyr
管道对其进行进一步的修改。