重复/复制数据帧的特定行并追加

  • 本文关键字:追加 复制 数据帧 重复 r
  • 更新时间 :
  • 英文 :


我想根据数据帧中的信息复制某一行。首选tidyverse解决方案。我希望在不显式调用函数中的原始数据帧的情况下实现这一点。

这是一个玩具的例子。

data.frame(var1 = c("A", "A", "A", "B", "B"), 
var2 = c(1, 2, 3, 4, 5), 
val = c(21, 31, 54, 65, 76))
var1 var2 val
1    A    1  21
2    A    2  31
3    A    3  54
4    B    4  65
5    B    5  76

到目前为止,我找到的所有解决方案都需要用户输入所需的行索引。我想找到一种以编程方式实现它的方法。在这种情况下,我想复制var1为"0"的行;A";其中CCD_ 3的最高值为"0";A";并附加到原始数据帧。预期输出为

var1 var2 val
1    A    1  21
2    A    2  31
3    A    3  54
4    B    4  65
5    B    5  76
6    A    3  54

使用dplyr的变体。按组查找max,过滤var1并追加。

library(dplyr)
df %>% 
group_by(var1) %>% 
filter(var2 == max(var2), 
var1 == "A") %>% 
bind_rows(df, .)
var1 var2 val
1    A    1  21
2    A    2  31
3    A    3  54
4    B    4  65
5    B    5  76
6    A    3  54

您可以选择要复制的行并将其添加到原始数据帧:

library(dplyr)
var1_variable <- 'A'
df %>%
filter(var1 == var1_variable) %>%
slice_max(var2, n = 1) %>%
#For dplyr < 1.0.0
#slice(which.max(var2)) %>%
bind_rows(df, .)
#  var1 var2 val
#1    A    1  21
#2    A    2  31
#3    A    3  54
#4    B    4  65
#5    B    5  76
#6    A    3  54

在基本R中,可以这样做:

df1 <- subset(df, var1 == var1_variable)
rbind(df, df1[which.max(df1$var2), ])

从这篇文章中,我们可以将之前的工作保存在一个临时变量中,然后绑定行,这样我们就不会断链,也不会绑定原始数据帧df

df %>%
#Previous list of commands
{
{. -> temp} %>%
filter(var1 == var1_variable) %>%
slice_max(var2, n = 1) %>%
bind_rows(temp)
}

base中,可以使用rbindsubsetvar1 == "A"var2值最高的行附加到原始数据帧。

rbind(x, subset(x[x$var1 == "A",], var2 == max(var2)))
#   var1 var2 val
#1     A    1  21
#2     A    2  31
#3     A    3  54
#4     B    4  65
#5     B    5  76
#31    A    3  54

数据:

x <- data.frame(var1 = c("A", "A", "A", "B", "B"), 
var2 = c(1, 2, 3, 4, 5), 
val = c(21, 31, 54, 65, 76))

带有uncount的选项

library(dplyr)
library(tidyr)
df1 %>%
uncount(replace(rep(1, n()), match(max(val[var1 == 'A']), val), 2)) %>% 
as_tibble
# A tibble: 6 x 3
#  var1   var2   val
#  <chr> <dbl> <dbl>
#1 A         1    21
#2 A         2    31
#3 A         3    54
#4 A         3    54
#5 B         4    65
#6 B         5    76

最新更新