向数据框中添加一行,其中 n 列填充了一个相同值 dplyr (add_row)

问题描述

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

好吧,有add_row

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

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

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

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

有没有办法避免硬编码?

解决方法

也许这会有所帮助:

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
,

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

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

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',c(5,4))
#[1] "blabla"   "blabla"   "blabla"   "blabla"   "blabla"   "blubblub"
#[7] "blubblub" "blubblub" "blubblub"

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

df <- tibble(x = 1:3,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)