简介:我如何添加m
行到我的m X n
数据帧,其中每个新行每个现有行之后插入? 我基本上将复制现有的行,但要改变一个变量。
更多细节:参照另外一个问题 ,我想我可以做我想做与RGL的segments3d功能。 我有一组X,Y,Z点,但这些都是一组线段的只是一个终点。 另一端的一点是这么多米远在Z尺度,给定为第四可变:X,Y,Z,Z_Length; 在我的术语是东向,北向,高程,长度。
按照RGL文档,“点都采取了对通过segments3d”。 所以,我觉得我需要修改我的数据帧有额外的条目具有改变变量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 |
+-------+---------+----------+-----------+---------+
在链接的问题的数据样本是可用的。
Answer 1:
您的样本数据:
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
Answer 2:
我不知道如何rgl
进场这里,但如果你只是想创建一个新的data.frame
有重复的值,请尝试:
df[rep(1:nrow(df),1,each=2),]
Answer 3:
这里是一个可能的方法,如果我知道你在做什么:
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]
两者都是等价的,但我认为圣坛的方式更快。
Answer 4:
从“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 ;)
Answer 5:
您可以创建具有两倍行一个新的矩阵,把旧数据帧元素回新的矩阵的适当位置,并留下的空白。 高程进行计算,创建一个新的矩阵,然后将调整仰角矩阵到更大的,新的矩阵。 然后,矩阵转换回的数据帧。
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)`
文章来源: How can I add rows to an R data frame every other row?