首页 文章

R dplyr:更改具有特定名称的列的行值

提问于
浏览
4

我有一个数据框 . 其中一列具有字符串值,我想将其用作其他列名称的条件 . 例如,

df <- data.frame(
  cond=c("a","b"),
  aVal=c(1  , 2),
  bVal=c(3  , 4)
)

我想逐行检查df中每列的名称,如果colname不以cond开头,那么我想将该列的值设置为0.这里的预期输出将是 .

#    cond aVal bVal
# 1    a    1    0
# 2    b    0    4

我不知道如何用R优先用dplyr做这个 .

3 回答

  • 2

    这是一个 tidyverse 解决方案 . 请注意,我使用 stringsAsFactors = FALSE 来创建示例数据框以避免因子列 . df2 是最终输出 .

    library(tidyverse)
    
    df2 <- df %>%
      gather(Column, Value, -cond) %>%
      mutate(Column2 = str_sub(Column, 1, 1)) %>%
      mutate(Value = ifelse(map2_lgl(cond, Column2, ~str_detect(.y, .x)), Value, 0)) %>%
      select(-Column2) %>%
      spread(Column, Value)
    df2
    #   cond aVal bVal
    # 1    a    1    0
    # 2    b    0    4
    

    Data

    df <- data.frame(
      cond=c("a","b"),
      aVal=c(1  , 2),
      bVal=c(3  , 4),
      stringsAsFactors = FALSE
    )
    
  • 4

    这是一个 base R 选项

    df[-1] <- df[-1] * t(apply(df, 1, function(x)  substr(names(x)[-1], 1, 1) == x[1]))
    df
    #   cond aVal bVal
    #1    a    1    0
    #2    b    0    4
    

    也是上述的变形

    df[-1] * (substr(matrix(names(df)[-1][row(df[-1])], 2, 2), 1, 1) == 
                   df$cond[col(df[-1])])
    
  • 4
    library(tidyverse)
    df <- data.frame(
      cond=c("a","b"),
      aVal=c(1  , 2),
      bVal=c(3  , 4)
    )
    
    gather(df, col1, col2, -cond) %>% 
      as.tibble() %>% 
      filter(str_sub(col1, 1, 1) == cond) %>% 
      spread(col1, col2) %>%
      mutate_at(vars(contains('Val')),
                funs(replace(., is.na(.), 0)))
    
    # A tibble: 2 x 3
      cond   aVal  bVal
      <fct> <dbl> <dbl>
    1 a         1     0
    2 b         0     4
    

相关问题