2014-02-11 5 views
0

lapply 함수 내부에 객체 이름을 포함하는 열을 만들고 싶습니다. 이것을 name.of.x.as.strig.function이라고합니다.(), 불행히도, 어떻게해야할지 모르겠다. 어쩌면 할당, do.call 및 붙여 넣기의 조합 일 수도있다. 그러나 지금까지는이 기능을 사용하여 문제가 더 심해졌을뿐입니다. 솔루션과 같은 더 많은 R이 있다고 확신합니다.r lapply 함수 안에 객체 이름을 포함하는 열을 만듭니다.

# generates a list of dataframes, 
data <- list(data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3)),data.frame(c(1,2),c(3,3))) 

# assigns names to dataframe 
names(data) <- list("one","two", "tree", "four") 

# subsets the second column into the object data.anova 
data.anova <- lapply(data, function(x){x <- x[[2]];           
             return(matrix(x))}) 

이 내 목록 안에 모든 행렬을 위해, 그것의 이름을 포함하는 dataframe 내부의 열을 만들 수 있도록해야

data.anova <- lapply(data, function(x){  
    x$id <- name.of.x.as.strig.function(x) 
    return(x)}) 

내가 검색하고 싶은 :

3 one 
3 one 

3 two 
3 two 

... 

하나를 입력이 높게 평가됩니다.

검색 기록 : 문자열로 개체 이름을 검색하는 기능을, R은 data.anova의 인덱스를 통해 ... 내부 laply 객체의

답변

3

가 방금 stack 찾고있는 될 수 있을까?

stack(lapply(data, `[[`, 2)) 
# values ind 
# 1  3 one 
# 2  3 one 
# 3  3 two 
# 4  3 two 
# 5  3 tree 
# 6  3 tree 
# 7  3 four 
# 8  3 four 

(또는 원래의 접근 방식 사용 : stack(lapply(data, function(x) {x <- x[[2]]; x})))이 "reshape2"의 경우, melt 경우

을도 작동합니다.

1

루프 이름을 얻고, 데이터와 이름을 모두 가져올 것을 사용

data.anova <- lapply(seq_along(data.anova), function(i){  
    x <- as.data.frame(data.anova[[i]]) 
    x$id <- names(data.anova)[i] 
    return(x)}) 

이 생성됩니다

# [[1]] 
# V1 id 
# 1 3 one 
# 2 3 one 

# [[2]] 
# V1 id 
# 1 3 two 
# 2 3 two 

# [[3]] 
# V1 id 
# 1 3 tree 
# 2 3 tree 

# [[4]] 
# V1 id 
# 1 3 four 
# 2 3 four 
+0

나는 이것이 일반적으로'lapply (names (data), function (x) data.frame (ID = x, value = data [[x]] [[2]]))와 비슷한 것을 할 것이다. 그들은 끝내고 .... 완전히 똑같은 생각, 그래도 +1 :-) – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, 언제나처럼 깨끗한 답을! – BrodieG

관련 문제