繁体   English   中英

R 在 dataframe 中查找值(因子变量按行排列)

[英]R find value in dataframe (rowwise for factor variables)

我有一个带有这样的字符串(因子)变量的df

id v1 v2 v3 v4
1  1  1  1  0
1  0  0  0  0
1  1  1  1  0
1  1  1  1  0
1  1  1  1  0

我想要的是创建一个等于 1 或 0(数字)的新列,如果列列表中出现或不显示 1 说 (v2, v3, v4)

id v1 v2 v3 v4 lu
1  1  1  1  0  1
2  0  0  0  0  0
3  1  1  1  0  1
4  0  0  1  0  1
5  1  0  1  0  1

我不想转换为数字(因为我需要它们以供将来分析)所以像

df <- df %>% mutate(lu = select(., v2:v4) %>% rowSums(na.rm = TRUE))
df <- df %>% mutate(lu = if_else(lu_1 > 0, 1, lu))

不可能。 实际上要考虑的变量列表相当长(大约 150 个)

谢谢!

嗨,我不知道你是否想要这样的东西。 我不擅长 dplyr 所以这是一个基本的 R 版本

虚拟数据:

a <-as.character(sample(0:1,100,replace = T))
b <-as.character(sample(0:1,100,replace = T))
c <-as.character(sample(0:1,100,replace = T))
d <-as.character(sample(0:1,100,replace = T))

df <- as.data.frame(cbind(a,b,c,d), stringsAsFactors = T)

实际代码:

test <- function(x) {
  out <- sum(as.numeric(x))
  ifelse(out>0,1,0)
}

df$lu <- as.factor(apply(df,MARGIN = 1, test))

output:

id  a   b   c   d   lu
1   0   1   0   0   1
2   0   1   0   0   1
3   0   1   0   0   1
4   0   1   0   1   1
5   0   0   0   0   0

计算起来也可能非常昂贵

library(tidyverse)



df_example <- data.table::fread("id v1 v2 v3 v4
1  1  1  1  0
1  0  0  0  0
1  1  1  1  0
1  1  1  1  0
1  1  1  1  0") %>% tibble()


df_example %>%
  mutate(across(-id,.fns = as_factor)) %>% 
  rowwise() %>% 
  mutate(lu = c_across(-id) %>%
           as.character() %>%
           as.numeric() %>%
           sum()) %>% 
  mutate(expensive = if_else(lu == 0,0,1))
#> # A tibble: 5 x 7
#> # Rowwise: 
#>      id v1    v2    v3    v4       lu expensive
#>   <int> <fct> <fct> <fct> <fct> <dbl>     <dbl>
#> 1     1 1     1     1     0         3         1
#> 2     1 0     0     0     0         0         0
#> 3     1 1     1     1     0         3         1
#> 4     1 1     1     1     0         3         1
#> 5     1 1     1     1     0         3         1

代表 package (v0.3.0) 于 2020 年 6 月 13 日创建

这可能会更快一些

df_example %>%
  mutate(across(-id,.fns = as_factor)) %>% 
  mutate(lu = rowSums(across(-id, .fns = ~ .x %>% as.character() %>% as.numeric()))) %>% 
  mutate(lu = if_else(lu == 0,0,1))

只是

df$lu <- as.numeric(rowSums(df[,3:5]=="1")>0)

或者,像 sharmajee499

df %>%
  mutate(lu=as.numeric(rowSums(df[,3:5]=="1")>0))

首先创建一个新列来对行求和,例如:

df<- df %>% mutate(sum= rowSums(df[,2:5])

之后,您可以对该列执行if条件以创建新列:

df<- df %>% mutate(lu= ifelse(sum>=1,1,0))

使用 dplyr 1.0,您可以使用 cross across()转换为数字,然后应用rowSums()

df %>%
  mutate(lu = rowSums(across(starts_with("v"), .fns = as.numeric)))

如果我们更喜欢二元结果,那么我们的新列中有总和:

df %>%
  mutate(lu = 1*(rowSums(across(starts_with("v"), .fns = as.numeric)) > 0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM