根据两列中的信息向我的数据框添加一列

add a column to my dataframe based on information in two columns

我想根据数据框两列中的信息向我的数据框添加一列。

在我的示例数据框中,一个样本有两行条目,分别是第 3 行和第 4 行。我想编写一个新列“main”并在每一行中填写“1”,其中有一个唯一的标签号。对于具有重复标签编号的行,我需要权重最高的行在 main 中为“1”,而所有其他行都用“0”填充。

df
       sp    weight   tag
1   green        70     1
2  yellow        63     2
3     red        41     3
4     red        25     3
5     red         9     3
df with "main" column added
       sp    weight   tag  main
1   green        70     1     1
2  yellow        63     2     1
3     red        41     3     1
4     red        25     3     0
5     red         9     3     0

这是我目前的情况:

df$is.uniq <- duplicated(df$tag) | duplicated(df$tag), fromLast = TRUE) 
df$main <- ifelse(is.uniq==TRUE, "1", ifelse(is.uniq==FALSE, "0", NA  )) 

我知道我需要更改第二个 ifelse 语句以引用重量列并为最大重量填充 1,为所有其他重量填充 0,但我还没有想出该怎么做。

我们可以通过操作创建一个组,并在具有'weight'

max逻辑条件下创建二进制
library(dplyr)
df %>% 
     group_by(sp) %>% 
      mutate(main = +(weight == max(weight)))

-输出

# A tibble: 5 x 4
# Groups:   sp [3]
#  sp     weight   tag  main
#  <chr>   <int> <int> <int>
#1 green      70     1     1
#2 yellow     63     2     1
#3 red        41     3     1
#4 red        25     3     0
#5 red         9     3     0

或者在 base R 中,一个选项是首先 order 按 'weight' 降序排列数据,然后应用 duplicated

dfnew <- df[order(df$sp, -df$weight),]
dfnew$main <- +(!duplicated(dfnew$sp))

数据

df <- structure(list(sp = c("green", "yellow", "red", "red", "red"), 
    weight = c(70L, 63L, 41L, 25L, 9L), tag = c(1L, 2L, 3L, 3L, 
    3L)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5"))

这个有用吗:

> library(dplyr)
> dat %>% left_join(dat %>% group_by(sp) %>% 
+                     filter(weight == max(weight)) %>% 
+                           mutate(main = 1) %>% select(X1, main), by = c('X1','sp')) %>% mutate(main = replace_na(main, 0))
Adding missing grouping variables: `sp`
# A tibble: 5 x 5
     X1 sp     weight   tag  main
  <dbl> <chr>   <dbl> <dbl> <dbl>
1     1 green      70     1     1
2     2 yellow     63     2     1
3     3 red        41     3     1
4     4 red        25     3     0
5     5 red         9     3     0
>