我在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
我请人帮我。
愿意为你使用以下方法工作的?
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
)
在你的榜样,你有值1,3,5 freq
变量,但在随后的例子中,你列出1,2,5?在我的例子,我把原来的freq
离开加入。你可以修改它进一步使用普通dplyr
管道,如果这是你打算去做。使用tidyr::full_seq
我们可以找到完整版Value
,但nesting(full_seq(Value,1)
会返回一个错误:
错误:
by
不能包含联接列full_seq(Value, 1)
这是从RHS失踪
所以我们需要添加一个名字,因此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.
使用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