Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在筛选后向dataframe添加具有值的新列_R_Dplyr - Fatal编程技术网

在筛选后向dataframe添加具有值的新列

在筛选后向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

这是我发现自己经常做的令人惊讶的事情,所以我想知道是否有一种更快的/“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      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))