向数据框添加一行,其中 n 列填充一个(相同的)值 dplyr (add_row)
Add a row to a data frame with n columns filled with one (the same) value dplyr (add_row)
想象一下,您想将一行添加到一个数据框(有很多列),该行用一个(相同的值)填充,但不想通过一一指定每个列值来对其进行硬编码。
还有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”和...
有没有办法避免硬编码?
也许这可以帮助:
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
通常不推荐按行添加数据,因为每列都有不同的 class 并且添加数据行可能会弄乱它们。
如果您想为每一行添加相同的值,要回答您的问题,您可以这样做:
df <- tibble(x = 1:3, y = 3:1)
df[nrow(df) + 1, ] <- 10
这将在所有值为 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
您可以创建所需的向量,并创建一个 one-row 数据框,其列名与原始数据相同。请注意,向量只能包含一种类型的数据,因此如果您混合使用数字和字符,它们会将数字转换为字符。要获得正确的 classes,您可以在创建一行数据框后使用 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)
想象一下,您想将一行添加到一个数据框(有很多列),该行用一个(相同的值)填充,但不想通过一一指定每个列值来对其进行硬编码。
还有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”和...
有没有办法避免硬编码?
也许这可以帮助:
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
通常不推荐按行添加数据,因为每列都有不同的 class 并且添加数据行可能会弄乱它们。
如果您想为每一行添加相同的值,要回答您的问题,您可以这样做:
df <- tibble(x = 1:3, y = 3:1)
df[nrow(df) + 1, ] <- 10
这将在所有值为 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
您可以创建所需的向量,并创建一个 one-row 数据框,其列名与原始数据相同。请注意,向量只能包含一种类型的数据,因此如果您混合使用数字和字符,它们会将数字转换为字符。要获得正确的 classes,您可以在创建一行数据框后使用 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)