在筛选后向dataframe添加具有值的新列
这是我发现自己经常做的令人惊讶的事情,所以我想知道是否有一种更快的/“R”方式来做:在筛选后向dataframe添加具有值的新列,r,dplyr,R,Dplyr,这是我发现自己经常做的令人惊讶的事情,所以我想知道是否有一种更快的/“R”方式来做: A: a b <dbl> <lgl> 1 1 FALSE 2 2 TRUE 3 3 TRUE 4 4 FALSE B: c d eeyyccc <dbl> <chr> <dbl> 1 11 AA 55 2 22 BB 6
A:
a b
<dbl> <lgl>
1 1 FALSE
2 2 TRUE
3 3 TRUE
4 4 FALSE
B:
c d eeyyccc
<dbl> <chr> <dbl>
1 11 AA 55
2 22 BB 66
有没有一种快速的“R”方法可以通过过滤和“动态”创建列来做到这一点?我不能明确使用B的任何列名,因为我事先不知道它们是什么
A <- tibble(a = c(1,2,3,4), b=c(F,T,T,F))
B <- tibble(c=c(11,22), d=c("AA", "BB"), eeyyccc=c(55,66))
A这里有一个选项。关键是创建一个合并变量(M
),然后进行合并。无需在B
中指定任何列名
library(dplyr)
A %>%
mutate(M = ifelse(b, cumsum(b), NA)) %>%
left_join(B %>% mutate(M = 1:n()), by = "M") %>%
select(-M)
# # A tibble: 4 x 5
# a b c d eeyyccc
# <dbl> <lgl> <dbl> <chr> <dbl>
# 1 1.00 F NA NA NA
# 2 2.00 T 11.0 AA 55.0
# 3 3.00 T 22.0 BB 66.0
# 4 4.00 F NA NA NA
库(dplyr)
A%>%
突变(M=ifelse(b,cumsum(b),NA))%>%
左联合(B%>%变异(M=1:n()),by=“M”)%>%
选择(-M)
##A tibble:4 x 5
#a b c d eeyyccc
#
#1 1.00 F不适用
#2.00 T 11.0 AA 55.0
#3.00 T 22.0 BB 66.0
#4.00 F不适用
这里有一个选项。关键是创建一个合并变量(M
),然后进行合并。无需在B
中指定任何列名
library(dplyr)
A %>%
mutate(M = ifelse(b, cumsum(b), NA)) %>%
left_join(B %>% mutate(M = 1:n()), by = "M") %>%
select(-M)
# # A tibble: 4 x 5
# a b c d eeyyccc
# <dbl> <lgl> <dbl> <chr> <dbl>
# 1 1.00 F NA NA NA
# 2 2.00 T 11.0 AA 55.0
# 3 3.00 T 22.0 BB 66.0
# 4 4.00 F NA NA NA
库(dplyr)
A%>%
突变(M=ifelse(b,cumsum(b),NA))%>%
左联合(B%>%变异(M=1:n()),by=“M”)%>%
选择(-M)
##A tibble:4 x 5
#a b c d eeyyccc
#
#1 1.00 F不适用
#2.00 T 11.0 AA 55.0
#3.00 T 22.0 BB 66.0
#4.00 F不适用
我们可以使用替换或使用dplyr
library(dplyr)
A %>%
mutate(c = replace(NA, b, B$c))
# A tibble: 4 x 3
# a b c
# <dbl> <lgl> <dbl>
#1 1.00 F NA
#2 2.00 T 11.0
#3 3.00 T 22.0
#4 4.00 F NA
更新
与更新的数据
library(purrr)
A[names(B)] <- map(B, ~ replace(NA, A$b, .x))
A
# A tibble: 4 x 5
# a b c d eeyyccc
# <dbl> <lgl> <dbl> <chr> <dbl>
#1 1.00 F NA <NA> NA
#2 2.00 T 11.0 AA 55.0
#3 3.00 T 22.0 BB 66.0
#4 4.00 F NA <NA> NA
我们可以使用replace
替换为dplyr
library(dplyr)
A %>%
mutate(c = replace(NA, b, B$c))
# A tibble: 4 x 3
# a b c
# <dbl> <lgl> <dbl>
#1 1.00 F NA
#2 2.00 T 11.0
#3 3.00 T 22.0
#4 4.00 F NA
更新
与更新的数据
library(purrr)
A[names(B)] <- map(B, ~ replace(NA, A$b, .x))
A
# A tibble: 4 x 5
# a b c d eeyyccc
# <dbl> <lgl> <dbl> <chr> <dbl>
#1 1.00 F NA <NA> NA
#2 2.00 T 11.0 AA 55.0
#3 3.00 T 22.0 BB 66.0
#4 4.00 F NA <NA> NA
一个选项是replace
即A%>%mutate(c=replace(NA,b,b$c))
一个选项是replace
即A%>%mutate(c=replace(NA,b,b$c))
但这意味着我只有一列c,对吗相反,我有很多列,我甚至不知道它们的名称…@Thomas在这种情况下,使用mutate_at
或mutate_,如果使用列索引/列名或基于列类型可能我的示例不够清楚,我尝试使其非常简单。不只是c,我的B有很多列的名字我事先不知道,所以我不能硬编码它们…@Thomas最好提供一个更好的例子来正确编码谢谢。我从未使用过purrr,必须查看文档才能理解map()到底在做什么,但您更新的代码片段正是我所需要的:)但这意味着我只有一列c,对吗相反,我有很多列,我甚至不知道它们的名称…@Thomas在这种情况下,使用mutate_at
或mutate_,如果使用列索引/列名或基于列类型可能我的示例不够清楚,我尝试使其非常简单。不只是c,我的B有很多列的名字我事先不知道,所以我不能硬编码它们…@Thomas最好提供一个更好的例子来正确编码谢谢。我从未使用过purrr,必须查看文档才能了解map()的具体功能,但您更新的代码片段正是我所需要的:)
A[names(B)] <- lapply(B, function(x) replace(NA, A$b, x))