【问题标题】:Add a row to a data frame with n columns filled with one (the same) value dplyr (add_row)向数据框中添加一行,其中 n 列填充一个(相同)值 dplyr (add_row)
【发布时间】:2020-12-29 14:09:04
【问题描述】:

假设您想将一行添加到一个填充有一个(相同值)的数据框(具有许多列),但不希望通过一一指定每个列值来对其进行硬编码。

嗯,有add_row

df <- tibble(x = 1:3, y = 3:1)

df %>% add_row(x = 4, y = 0)

但是,假设您的数据框有 40 列,并且您希望该行包含 40 次“blabla”,您可能会避免 add_row(x = "blabla", y = "blabla", ..., n="blabla")

或者想象一下,前五列应该用“blabla”填充,接下来的五列应该用“blubblub”填充......

有没有办法避免硬编码?

【问题讨论】:

  • 如果使用case_when(...) from dplyr 并根据列范围填充会怎样?

标签: r dplyr row add rbind


【解决方案1】:

通常不建议按行添加数据,因为每列都有不同的类,添加数据行可能会弄乱它们。

如果您想为每一行添加相同的值,要回答您的问题,您可以这样做:

df <- tibble(x = 1:3, y = 3:1)
df[nrow(df) + 1, ] <- 10

这将在 tibble 中添加一个新行,所有值都为 10。


如果您想添加不同的值而不需要手动编写它们,您可以使用rep 重复某些值n 次数。

要重复 'blabla''blubblub' 5 次,您可以将向量创建为

rep(c('blabla', 'blubblub'), each = 5)
#[1] "blabla"   "blabla"   "blabla"   "blabla"   "blabla"  
#[6] "blubblub" "blubblub" "blubblub" "blubblub" "blubblub"

重复'blabla' 5 次和'blubblub' 4 次你可以这样做:

rep(c('blabla', 'blubblub'), c(5, 4))
#[1] "blabla"   "blabla"   "blabla"   "blabla"   "blabla"   "blubblub"
#[7] "blubblub" "blubblub" "blubblub"

因此,使用rep,您可以创建所需的向量并创建列名与原始数据相同的单行数据框。请注意,向量只能包含一种类型的数据,因此如果您将数字和字符混合在一起,它们会将数字转换为字符。要获得正确的类,您可以在创建一个行数据框后使用type.convert

df <- tibble(x = 1:3, y = 3:1, z = 'a')
other_data <- setNames(data.frame(t(c(rep(10, 2), 'b'))), names(df))
other_data <- type.convert(other_data, as.is = TRUE)
result <- rbind(df, other_data)

【讨论】:

    【解决方案2】:

    也许这会有所帮助:

    library(dplyr)
    library(tidyr)
    #Data
    df <- tibble(x = 1:3, y = 3:1,z=1,a=5,b=3,c=2)
    #Code
    df %>% bind_rows(data.frame(x = 4, z = 0)) %>%
      mutate(id=row_number()) %>%
      pivot_longer(-id) %>%
      group_by(id) %>%
      fill(value) %>%
      pivot_wider(names_from = name,values_from=value) %>%
      ungroup() %>% select(-id)
    

    输出:

    # A tibble: 4 x 6
          x     y     z     a     b     c
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1     1     3     1     5     3     2
    2     2     2     1     5     3     2
    3     3     1     1     5     3     2
    4     4     4     0     0     0     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 2022-08-13
      • 1970-01-01
      • 2018-07-25
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多