는 R

2017-12-13 18 views
0
내가 벡터화 작업을 사용하여 R에 데이터 테이블을 채우기 위해 노력하고

에서 벡터화 기능을 사용하여 데이터 테이블을 작성 :는 R

library(data.table) 
x = 5 
y = 3 
Foo = data.table(Bar = 1:x) 
Foo[,paste0("simulation",1:y) := Bar * rnorm(y,,Bar)] 

내가 생각을 각 행에 대해, rnorm (Y ,, 바) 것 ay 길이 벡터 (행의 Bar를 표준 편차로 사용)를 만들고 그 행에 Bar 값을 곱한 다음 해당 열을 채 웁니다. 그러나, (다른 실험에서) 먼저 열을 내려가려고하는 것 같습니다. 이 동작을 변경하는 방법이 있습니까?

+0

넣지 마십시오 벡터를 만들 수 있습니다. 대신에 다음과 같이 긴 형식으로 저장하십시오 :'Foo [,. (bar = rep (Bar, each = y), v = rnorm (y * .N,, rep (Bar, each = .N)))]]'또는' Foo [, rnorm (y ,, Bar), by = Bar]' – Frank

+0

그래서 두 개의 열만 사용하고 Bar의 각 값에 대해 y 행을 만들 것을 제안합니다. 다시 원하는 형식으로 되돌릴 수있는 쉬운 방법이 있습니까 (y + 1 열, 막대의 각 값에 대해 하나의 행)? – Sinnombre

+0

예,'res <- Foo [, rnorm (y ,, Bar), by = Bar]를 사용할 수 있습니다; dcast (res, Bar ~ rowid (Bar, prefix = "sim"))'. 그러나, 좀 더 관용적 인 res [, do_stuff, by = Bar]와 비교할 때, 분석하는 것이 훨씬 어렵다고 생각합니다. 와이드 포맷으로 퍼팅하는 것은 내 경험에 대한 분석보다는 탐색에 가장 유용합니다. – Frank

답변

1

우리는 '바'의 값을 반복하고 열에 R 저장 벡터 있기 때문에, 테이블 행에 rnorm

Foo[, paste0("simulation",seq_len(y)) :=transpose(lapply(Bar, function(z) rnorm(y, sd = z)))] 
+0

벡터 라이팅의 이점을 희생하지 않습니까? – Sinnombre