根据R中同一数据框中另一列的值将值分配给一列

Assigning values to a column in the based on values of another column in the same dataframe in R

我有一个包含 3 列的数据框,如果在另一行中满足条件之和,我想将值分配给该数据框的第四列。在这个例子中,如果每一行的 df[3]>=2,我想将 1 分配给 df[4]。

我想要的输出示例是:

感谢任何帮助。

谢谢,

如果 time1time2 都为 1,您要分配 1 吗?

如果只有两列你可以做-

df$label <- as.integer(df$time1 == 1 & df$time2 == 1)

如果有很多这样的时间列我们可以借助rowSums -

cols <- grep('time', names(df))
df$label <- as.integer(rowSums(df[cols] == 1) == length(cols))
df

#  a time1 time2 label
#1 a     1     1     1
#2 b     1     0     0
#3 c     1     1     1
#4 d     0     1     0
#5 e     0     0     0

数据

图像不是共享数据的正确方式,请以可复制的格式提供它们。

df <- data.frame(a = letters[1:5], 
                 time1 = c(1, 1, 1, 0, 0), 
                 time2 = c(1, 0, 1, 1, 0))
library(tidyverse)

data <- 
    tribble(
        ~ID, ~time1, ~time2,
        'jkjkdf', 1, 1,
        'kjkj', 1, 0,
        'fgf', 1, 1,
        'jhkj', 0, 1, 
        'hgd', 0,0
    )

mutate(data, label = if_else(time1 + time2 >= 2, 1, 0))
#> # A tibble: 5 x 4
#>   ID     time1 time2 label
#>   <chr>  <dbl> <dbl> <dbl>
#> 1 jkjkdf     1     1     1
#> 2 kjkj       1     0     0
#> 3 fgf        1     1     1
#> 4 jhkj       0     1     0
#> 5 hgd        0     0     0

#or with n time columns

data %>%
    rowwise() %>% 
    mutate(label = if_else(sum(across(starts_with('time'))) >= 2, 1, 0))
#> # A tibble: 5 x 4
#> # Rowwise: 
#>   ID     time1 time2 label
#>   <chr>  <dbl> <dbl> <dbl>
#> 1 jkjkdf     1     1     1
#> 2 kjkj       1     0     0
#> 3 fgf        1     1     1
#> 4 jhkj       0     1     0
#> 5 hgd        0     0     0

reprex package (v2.0.0)

创建于 2021-06-06

我们可以使用 magrittr 中的 tidyverse methods - select the columns that starts_with 'time' in column name, reduce it to a single vector by adding (+) the corresponding elements, use the aliases 以矢量化方式进行精简,将其转换为二进制文件以创建 'label' 列。最后,如果我们想要更改原始对象,则应将对象分配(<-)到原始数据

library(dplyr)
library(purrr)
library(magrittr)
df %>%
    mutate(label = select(cur_data(), starts_with('time')) %>%
               reduce(`+`) %>% 
               is_weakly_greater_than(2) %>% 
               multiply_by(1))
  a time1 time2 label
1 a     1     1     1
2 b     1     0     0
3 c     1     1     1
4 d     0     1     0
5 e     0     0     0

数据

df <- structure(list(a = c("a", "b", "c", "d", "e"), time1 = c(1, 1, 
1, 0, 0), time2 = c(1, 0, 1, 1, 0)), class = "data.frame", row.names = c(NA, 
-5L))