我想根据数据帧中的信息复制某一行。首选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中,可以使用rbind
和subset
将var1 == "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