6

简介:如何将m行添加到我的m X n数据框中,在每个现有行之后插入每个新行?我将基本上复制现有行,但对一个变量进行更改。

更多细节:关于另一个问题,我想我可以用 rgl 的segments3d 函数做我想做的事。我有一组 x,y,z 点,但这些只是一组线段的一个端点。另一个端点在 Z 维度上很远,作为第四个变量给出:X,Y,Z,Z_Length;在我的术语中,它是东、北、高程、长度。

根据 rgl 文档,“点由segments3d 成对获取”。所以,我认为我需要修改我的数据框,以便每隔两行添加一个带有更改的 Z 变量的额外条目(通过从 Z 中减去 Z_Length)。从视觉上看,它需要从这个开始:

+-------+---------+----------+-----------+---------+
| Label | easting | northing | elevation | length  |
+-------+---------+----------+-----------+---------+
| 47063 |  554952 |  5804714 | 32.68     | 619.25  |
| 47311 |  492126 |  5730703 | 10.40     | 1773.00 |
+-------+---------+----------+-----------+---------+

对此:

+-------+---------+----------+-----------+---------+
| Label | easting | northing | elevation | length  |
+-------+---------+----------+-----------+---------+
| 47063 |  554952 |  5804714 | 32.68     | 619.25  |
| 47063 |  554952 |  5804714 | -586.57   | 619.25  |
| 47311 |  492126 |  5730703 | 10.40     | 1773.00 |
| 47311 |  492126 |  5730703 | -1762.26  | 1773.00 |
+-------+---------+----------+-----------+---------+

链接问题的数据样本可用。

4

5 回答 5

10

您的样本数据:

orig.df <- read.table(text = "
Label easting northing elevation length
47063  554952  5804714 32.68 619.25 
47311  492126  5730703 10.40 1773.00", header = TRUE)

创建要插入的数据:

insert.df <- transform(orig.df, elevation = elevation - length)

将其附加到您的原始数据:

out.df <- rbind(orig.df, insert.df)

重新排序行:

n <- nrow(orig.df)
out.df[kronecker(1:n, c(0, n), "+"), ]
#   Label easting northing elevation  length
# 1 47063  554952  5804714     32.68  619.25
# 3 47063  554952  5804714   -586.57  619.25
# 2 47311  492126  5730703     10.40 1773.00
# 4 47311  492126  5730703  -1762.60 1773.00
于 2013-05-09T03:15:40.330 回答
5

我不确定如何rgl在这里发挥作用,但如果您只想创建一个data.frame具有重复值的新值,请尝试:

df[rep(1:nrow(df),1,each=2),]
于 2013-05-09T03:05:30.813 回答
2

如果我了解您在做什么,这是一种可能的方法:

dat <- head(CO2, 10) # fake data set

L1 <- lapply(1:nrow(dat), function(i) {
    dat2x <-  dat[i, ]
    dat2x[4] <- dat[i, 4] - dat[i, 5]
    rbind(dat[i, ], dat2x)
})
do.call(rbind, L1)

编辑:完全解决 e4e5f4 的出色反应:

new <- dat[rep(1:nrow(dat),1,each=2),]
new[c(F, T),4] <- dat[4] - dat[5]

两者都是等价的,但我认为改变速度更快。

于 2013-05-09T02:56:13.727 回答
2

修改自“e4e5f4”的响应

在行之间插入空白行

    # sample matrix of df 
    old <-matrix(1:9, ncol=3)

    # double all rows 
    new <- old[rep(1:nrow(old),1,each=2),]

    # replace all duplicates with blank cells
    new[c(seq(2, dim(new)[1], by=2)), ] <- ""

    old # original 
    new # all ok ;)
于 2015-04-19T16:09:41.980 回答
0

您可以创建一个具有两倍行数的新矩阵,将旧数据框元素放回新矩阵的适当位置,并留下空隙。执行高程计算,创建一个新矩阵,然后将调整后的高程矩阵插入到更大的新矩阵中。然后将矩阵转换回数据框。

test <- matrix(1:9, ncol=3)
ind <- (1:nrow(test)*2 - 1 # - 1 b/c you want to insert rows after, not before, existing rows
test_new <- matrix(rep(NA, (nrow(test)*2*ncol(test))), ncol=ncol(test))
test_new[ind,] <- test

test_elev <- test #create a new matrix that will have adjusted elevations
test_elev[,2] <- test[,2] - test[,3] #e.g., test[,2] is the elevation column, and test[,3] is the length column
test_new[ind+1,] <- test_elev #then put the new elevations into the new matrix

#if you need it to be a data.frame() again, you can use `as.data.frame(test_new)`
于 2013-05-09T02:57:59.897 回答