2013-05-09 62 views
6

Giới thiệu tóm tắt: làm cách nào để thêm m hàng vào khung dữ liệu m X n của mình, trong đó mỗi hàng mới được chèn sau mỗi hàng hiện có? Về cơ bản tôi sẽ sao chép hàng hiện có, nhưng thực hiện thay đổi cho một biến.Làm cách nào để thêm hàng vào khung dữ liệu R trên mỗi hàng khác?

Thêm chi tiết: tham chiếu đến another question, tôi nghĩ tôi có thể làm những gì tôi muốn với chức năng phân đoạn của rgl3d. Tôi có một tập hợp các điểm x, y, z, nhưng đây chỉ là một điểm kết thúc của một tập hợp các đoạn đường. Điểm kết thúc khác là rất nhiều mét trong kích thước Z, được cho là biến thứ tư: X, Y, Z, Z_Length; trong thuật ngữ của tôi nó là hướng đông, hướng bắc, độ cao, chiều dài.

Theo tài liệu rgl, "Điểm được lấy theo cặp theo phân đoạn3d". Vì vậy, tôi nghĩ rằng tôi cần phải sửa đổi khung dữ liệu của tôi để có thêm mục mỗi dòng thứ hai với một biến Z thay đổi (bằng cách trừ Z_Length từ Z). Nhìn bề ngoài, nó cần phải đi từ này:

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

này:

+-------+---------+----------+-----------+---------+ 
| 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 | 
+-------+---------+----------+-----------+---------+ 

Một mẫu dữ liệu ở câu hỏi liên quan có sẵn.

Trả lời

8

dữ liệu mẫu của bạn:

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) 

Tạo dữ liệu của bạn để chèn:

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

Nối nó với dữ liệu ban đầu của bạn:

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

Sắp xếp lại các hàng:

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 
+0

Tôi nghĩ rằng tôi sẽ cần phải sử dụng một loại sắp xếp trong giải pháp của tôi, nhưng kronecker không phải là những gì tôi mong đợi ... bạn có thể giải thích nó hoạt động như thế nào? –

+2

Xem những gì 'kronecker (1: 5, c (0,5)," + ")' cung cấp cho bạn. Đối với mỗi phần tử trong vector đầu tiên, nó thêm ('FUN =" + "') tất cả các phần tử trong vectơ thứ hai, vì vậy bạn nhận được: '1 + 0, 1 + 5, 2 + 0, 2 + 5, v.v. '. Chắc chắn có những cách khác để có được vector đó của các chỉ số, nhưng tôi thấy điều này thật thú vị. – flodel

+2

Đó là hoang dã, tôi thích nó. Bộ não của bạn hoạt động theo những cách tuyệt vời. –

2

Dưới đây là một cách tiếp cận có thể nếu tôi hiểu những gì bạn đang thực hiện:

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) 

EDIT: hoàn toàn làm việc tắt phản ứng tuyệt vời e4e5f4 của:

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

Cả hai đều là tương đương nhưng tôi giả định thay đổi là cách nhanh hơn.

+0

(1) để cung cấp câu trả lời hoàn chỉnh.Tôi không nhận thấy sự thay đổi cần thiết trong cột 4! – Nishanth

+1

Vâng, tôi cũng bỏ lỡ điều đó ở vòng đầu tiên. –

0

Bạn có thể tạo ma trận mới với nhiều hàng gấp hai lần, đưa các thành phần khung dữ liệu cũ trở lại vị trí thích hợp của ma trận mới và để lại khoảng trống. Thực hiện các phép tính trên độ cao, tạo một ma trận mới, sau đó chèn ma trận độ cao đã điều chỉnh vào ma trận mới, lớn hơn. Sau đó chuyển đổi ma trận trở lại một khung dữ liệu.

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)` 
5

Tôi không chắc chắn như thế nào rgl đến chơi ở đây, nhưng nếu bạn chỉ muốn tạo ra một mới data.frame với các giá trị lặp đi lặp lại, hãy thử:

df[rep(1:nrow(df),1,each=2),] 
+0

rgl vì câu hỏi dự thảo đầu tiên được đóng khung nhiều hơn về phía khía cạnh segment3d. Bản nháp cuối cùng đã thay đổi nó thành nhiều hơn một truy vấn khung dữ liệu. Cảm ơn câu trả lời. –

+0

1 trong đại diện (..., 1, ...) là gì? Nó có vẻ làm việc tốt mà không có nó? – Xizam

2

sửa đổi từ "của e4e5f4" phản ứng

Chèn các hàng trống betweens hàng

# 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 ;) 
Các vấn đề liên quan