按具有不同ID值的列展开R中的dataframe
我在R中有以下数据帧按具有不同ID值的列展开R中的dataframe,r,subset,tidyverse,R,Subset,Tidyverse,我在R中有以下数据帧 df1 <- data.frame( "ID" = c("A", "B", "A", "B"), "Value" = c(1, 2, 5, 5), "freq" = c(1, 3, 5, 3) ) 我尝试了以下代码 library(tidyverse) df_new <- bind_cols(df1 %>% select(Value, freq, ID) %>%
df1 <- data.frame(
"ID" = c("A", "B", "A", "B"),
"Value" = c(1, 2, 5, 5),
"freq" = c(1, 3, 5, 3)
)
我尝试了以下代码
library(tidyverse)
df_new <- bind_cols(df1 %>%
select(Value, freq, ID) %>%
complete(., expand(.,
Value = min(df1$Value):max(df1$Value))),)
库(tidyverse)
df_新%
选择(值、频率、ID)%>%
完成(、展开(.)。,
值=最小值(df1$Value):最大值(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
值频率ID
11A
2.3 B
3娜娜
4娜娜
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)
后果
评论
- 如果我正确地遵循了您的示例,则您的
组的值为1到5。如果是这种情况,我的方法将是从原始数据帧生成这两种数据的唯一组合ID
- 从原始数据帧中携带的唯一变量是<强>代码> Frq <强> >对于给定的PARP<强> >代码> ID值 < /强>,可能不可用。我将通过
(正如您喜欢的left\u join
)加入该变量tidyverse
- 在您的示例中,您有值为1,3,5的
变量,但在示例中您列出了1,2,5?在我的示例中,我使用了原始的freq
,然后左键加入它。如果您打算这样做,可以使用普通的freq
pipeline进一步修改它dplyr
- 在您的示例中,您有值为1,3,5的
- 以下方法对您有效吗
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)
后果
评论
- 如果我正确地遵循了您的示例,则您的
组的值为1到5。如果是这种情况,我的方法将是从原始数据帧生成这两种数据的唯一组合ID
- 从原始数据帧中携带的唯一变量是<强>代码> Frq <强> >对于给定的PARP<强> >代码> ID值 < /强>,可能不可用。我将通过
(正如您喜欢的left\u join
)加入该变量tidyverse
- 在您的示例中,您有值为1,3,5的
变量,但在示例中您列出了1,2,5?在我的示例中,我使用了原始的freq
,然后左键加入它。如果您打算这样做,可以使用普通的freq
pipeline进一步修改它dplyr
- 在您的示例中,您有值为1,3,5的
数据。表
:
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
使用
数据。表:
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
使用tidyr::full_seq
我们可以找到Value
的完整版本,但是嵌套(full_seq(Value,1)
将返回一个错误:
错误:by
不能包含RHS中缺少的联接列full_seq(值,1)
因此我们需要添加一个名称,因此嵌套(Value=full_seq(Value,1)
library(tidyr)
df1%>%完成(ID,嵌套(值=完整顺序(值,1)))
#一个tibble:10x3
ID值频率
1 A 1.1。
2 A 2.不适用
3 A 3.不适用
4 A 4.不适用
5 A 5.5。
6b1.NA
7b2.3。
8 B 3.不适用
9 B 4.NA
10 B 5.3。
使用tidyr::full\ seq
我们可以找到值的完整版本,但是嵌套(full\ seq(Value,1)
将返回一个错误:
错误:by
不能包含RHS中缺少的联接列full_seq(值,1)
因此我们需要添加一个名称,因此嵌套(Value=full_seq(Value,1)
library(tidyr)
df1%>%完成(ID,嵌套(值=完整顺序(值,1)))
#一个tibble:10x3
ID值频率
1 A 1.1。
2 A 2.不适用
3 A 3.不适用
4 A 4.不适用
5 A 5.5。
6b1.NA
7b2.3。
8 B 3.不适用
9 B 4.NA
10 B 5.3。
但如果您查看第5行,它与所需的输出不同。可能是输入错误。非常好的方法though@patL我认为期望的输出中有一个输入错误,或者计算了freq
,但原始帖子目前没有提供足够的细节。是的。我也这么认为,但我想指出它以防万一。@patL我在发布我的答案之前检查了它,它可能是一种类型,因为freq=c(1,3,5,3)
@a.Suliman这就是我试图回答这个问题时的想法但如果你看第5行,它与期望的输出不同。可能是打字错误。非常好的方法though@patL我认为期望的输出中有一个输入错误,或者计算了freq
,但原始帖子目前没有提供足够的细节。是的。我也这么认为,但我想指出它以防万一。@patL I chec在我发布我的答案之前,我把它删掉了,它可能是一种类型,因为freq=c(1,3,5,3)
@a.Suliman这是我试图回答这个问题时的想法。;)CJ指的是什么。交叉连接:只要试着运行CJ(ID=c(“a”,“B”),Value=1:5)
单独运行。就像R基中的expand.grid一样。CJ指的是什么。交叉连接:只需分别运行CJ(ID=c(“A”,“B”),Value=1:5)
。就像R基中的expand.grid一样。
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.