根据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]。
我想要的输出示例是:
感谢任何帮助。
谢谢,
如果 time1
和 time2
都为 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))
我有一个包含 3 列的数据框,如果在另一行中满足条件之和,我想将值分配给该数据框的第四列。在这个例子中,如果每一行的 df[3]>=2,我想将 1 分配给 df[4]。
我想要的输出示例是:
感谢任何帮助。
谢谢,
如果 time1
和 time2
都为 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))