删除数据框中的最后一个值,将行绑定到同一个数据框,第一列为零,重复 100 次
Drop the last value in dataframe, bind the row to the same dataframe with a zero in place for the first colum, repeat 100 times
我有一个数据框 'data.frame': 1 obs. of 100 variables
,我需要将这一行重复 100 次,每次在 n+1 的第一列中使用不同数量的零,或者与数据帧的索引一样多的零第 1 行。同时,我需要删除行的最后一个值,以便以 100 x 100 数据帧结尾。
数据框如下所示:
# A tibble: 1 x 1
Mass_PM10_evdf$~ $Mass2 $Mass3 $Mass4 $Mass5 $Mass6 $Mass7 $Mass8 $Mass9
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 5.48 11.1 11.3 11.4 11.6 11.7 11.9 12.1 12.2
我做了一个简短的例子来说明我需要的输出看起来像什么,只使用前 5 列。
sample$Mass1 $Mass2 $Mass3 $Mass4 $Mass5
<dbl> <dbl> <dbl> <dbl> <dbl>
1 5.49 11.1 11.3 11.4 11.6
2 0 5.49 11.1 11.3 11.4
3 0 0 5.49 11.1 11.3
4 0 0 0 5.49 11.1
5 0 0 0 0 5.49
我怎样才能或多或少地自动执行此操作?感谢您的帮助。
您可以使用 lapply
重复行:
vec <- unlist(df)
n <- ncol(df)
new_data <- as.data.frame(do.call(rbind, lapply(n:1,
function(x) c(rep(0, n - x), head(vec, x)))))
# Mass_PM10_evdf Mass2 Mass3 Mass4 Mass5 Mass6 Mass7 Mass8 Mass9
#1 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10 12.20
#2 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10
#3 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90
#4 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70
#5 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60
#6 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40
#7 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30
#8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10
#9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48
数据
df <- structure(list(Mass_PM10_evdf = 5.48, Mass2 = 11.1, Mass3 = 11.3,
Mass4 = 11.4, Mass5 = 11.6, Mass6 = 11.7, Mass7 = 11.9, Mass8 = 12.1,
Mass9 = 12.2), class = "data.frame", row.names = "1")
在base R
中,我们可以直接用toeplitz
构造matrix
,然后将下三角值设置为0
out <- toeplitz(unlist(df))
out[lower.tri(out)] <- 0
colnames(out) <- colnames(df)
out
# Mass_PM10_evdf Mass2 Mass3 Mass4 Mass5 Mass6 Mass7 Mass8 Mass9
# [1,] 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10 12.20
# [2,] 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10
# [3,] 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90
# [4,] 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70
# [5,] 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60
# [6,] 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40
# [7,] 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30
# [8,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10
# [9,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48
数据
df <- structure(list(Mass_PM10_evdf = 5.48, Mass2 = 11.1, Mass3 = 11.3,
Mass4 = 11.4, Mass5 = 11.6, Mass6 = 11.7, Mass7 = 11.9, Mass8 = 12.1,
Mass9 = 12.2), class = "data.frame", row.names = "1")
我有一个数据框 'data.frame': 1 obs. of 100 variables
,我需要将这一行重复 100 次,每次在 n+1 的第一列中使用不同数量的零,或者与数据帧的索引一样多的零第 1 行。同时,我需要删除行的最后一个值,以便以 100 x 100 数据帧结尾。
数据框如下所示:
# A tibble: 1 x 1
Mass_PM10_evdf$~ $Mass2 $Mass3 $Mass4 $Mass5 $Mass6 $Mass7 $Mass8 $Mass9
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 5.48 11.1 11.3 11.4 11.6 11.7 11.9 12.1 12.2
我做了一个简短的例子来说明我需要的输出看起来像什么,只使用前 5 列。
sample$Mass1 $Mass2 $Mass3 $Mass4 $Mass5
<dbl> <dbl> <dbl> <dbl> <dbl>
1 5.49 11.1 11.3 11.4 11.6
2 0 5.49 11.1 11.3 11.4
3 0 0 5.49 11.1 11.3
4 0 0 0 5.49 11.1
5 0 0 0 0 5.49
我怎样才能或多或少地自动执行此操作?感谢您的帮助。
您可以使用 lapply
重复行:
vec <- unlist(df)
n <- ncol(df)
new_data <- as.data.frame(do.call(rbind, lapply(n:1,
function(x) c(rep(0, n - x), head(vec, x)))))
# Mass_PM10_evdf Mass2 Mass3 Mass4 Mass5 Mass6 Mass7 Mass8 Mass9
#1 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10 12.20
#2 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10
#3 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90
#4 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70
#5 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60
#6 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40
#7 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30
#8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10
#9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48
数据
df <- structure(list(Mass_PM10_evdf = 5.48, Mass2 = 11.1, Mass3 = 11.3,
Mass4 = 11.4, Mass5 = 11.6, Mass6 = 11.7, Mass7 = 11.9, Mass8 = 12.1,
Mass9 = 12.2), class = "data.frame", row.names = "1")
在base R
中,我们可以直接用toeplitz
构造matrix
,然后将下三角值设置为0
out <- toeplitz(unlist(df))
out[lower.tri(out)] <- 0
colnames(out) <- colnames(df)
out
# Mass_PM10_evdf Mass2 Mass3 Mass4 Mass5 Mass6 Mass7 Mass8 Mass9
# [1,] 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10 12.20
# [2,] 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90 12.10
# [3,] 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70 11.90
# [4,] 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60 11.70
# [5,] 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40 11.60
# [6,] 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30 11.40
# [7,] 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10 11.30
# [8,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48 11.10
# [9,] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 5.48
数据
df <- structure(list(Mass_PM10_evdf = 5.48, Mass2 = 11.1, Mass3 = 11.3,
Mass4 = 11.4, Mass5 = 11.6, Mass6 = 11.7, Mass7 = 11.9, Mass8 = 12.1,
Mass9 = 12.2), class = "data.frame", row.names = "1")