【问题标题】:Add a row in a dataframe taking values from a vector R在从向量 R 中获取值的数据框中添加一行
【发布时间】:2021-10-07 08:40:34
【问题描述】:

我有一个这样的 df

df <- data.frame (id = c(123,123,456), w1= c("abc","fgh","kit"), w2 = c("eat","drink","ty"))

   id  w1    w2
1 123 abc   eat
2 123 fgh drink
3 456 kit    ty

和一个向量

vec <- c('value1', 'value2'). 

当有精确的对应关系时,我想将这些值添加到 df 中。我想获得的最终df是这样的:

   id  w1    w2 new_col
1 123 abc   eat  value1
2 123 abc   eat  value2
3 123 fgh drink  no correspondance
4 456 kit    ty  no correspondance

我试过这段代码

for (i in 1:length(df$id)) { ## for iterating each row 
  if (df$w2[i] == 'eat') {
    df$new_col[i] <- vec ### how to? Here I need to replace both 'value1' and 'value2' copying the row 
  }
}

有人可以给我一些建议吗?提前致谢!

【问题讨论】:

  • when there is a precise correspondance需要详细说明吗?

标签: r dataframe rbind


【解决方案1】:

您可以在数据框中添加一个列表列,然后使用tidyr::unnest 将它们作为单独的行来获取。

inds <- df$w2 == "eat"
df$new_col[!inds] <- 'no correspondance'
df$new_col[inds] <- list(vec)
tidyr::unnest(df, new_col)

#     id w1    w2    new_col          
#  <dbl> <chr> <chr> <chr>            
#1   123 abc   eat   value1           
#2   123 abc   eat   value2           
#3   123 fgh   drink no correspondance
#4   456 kit   ty    no correspondance

【讨论】:

    【解决方案2】:

    使用tidyr库:

    > library(tidyr)
    > df[1, 'new_col'] <- toString(vec)
    > df %>% separate_rows(new_col)
    # A tibble: 4 x 4
         id w1    w2    new_col
      <dbl> <chr> <chr> <chr>  
    1   123 abc   eat   value1 
    2   123 abc   eat   value2 
    3   123 fgh   drink <NA>   
    4   456 kit   ty    <NA>   
    > 
    

    编辑:

    > library(tidyr)
    > df[1, 'new_col'] <- toString(vec)
    > df %>% %>% filter(new_col %in% c('value1', 'value2')) %>% separate_rows(new_col) %>% bind_rows(filter(df, !new_col %in% c('value1', 'value2')))
    
    # A tibble: 4 x 4
         id w1    w2    new_col
      <dbl> <chr> <chr> <chr>  
    1   123 abc   eat   value1 
    2   123 abc   eat   value2 
    3   123 fgh   drink <NA>   
    4   456 kit   ty    <NA>   
    > 
    

    【讨论】:

    • 如果我只想将separate_rows 应用于第一行怎么办?我不想分离整个数据框
    • @PersianK 它只对new_col 这样做,所以应该很好
    • 是的,但是如果例如我有一个字符串而不是 NA,我如何保留该字符串并仅用 'value1' 和 'value2' 分隔行?
    • 在编辑问题时更清楚。我不想拆分字符串“没有对应关系”。
    • @PersianK 编辑我的
    【解决方案3】:

    使用tidyverse,我们可以用case_when创建一个逻辑条件并返回一个list列,然后对list列进行unnesting

    library(dplyr)
    library(tidyr)
    df %>% 
       mutate(new_col = case_when(w2 == 'eat' ~ list(vec), 
               TRUE ~ list('no correspondance'))) %>% 
       unnest(new_col)
    # A tibble: 4 × 4
         id w1    w2    new_col          
      <dbl> <chr> <chr> <chr>            
    1   123 abc   eat   value1           
    2   123 abc   eat   value2           
    3   123 fgh   drink no correspondance
    4   456 kit   ty    no correspondance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2022-12-11
      • 2012-04-09
      • 2021-02-01
      • 1970-01-01
      • 2021-06-11
      相关资源
      最近更新 更多