R 언어 - list 의 끼 워 넣 기와 끼 워 넣 은 값 추출 실현

5837 단어
R 의 데이터 구 조 는 여러 가지 가 있 는데 주로 벡터 벡터, 매트릭스 매트릭스 매트릭스, 배열 array, 목록 list 와 dataframe 데이터 상 자 를 포함한다.
앞의 세 가 지 는 모두 특정한 성질 과 구 조 를 가지 고 있 습 니 다. 오늘 소개 할 것 은 list 입 니 다. 매우 유연 하고 사용 하기 좋 습 니 다. 서로 다른 데이터 형식 을 저장 할 수 있 기 때 문 입 니 다!
이전에 assignment 를 할 때 list 의 아름다움 을 발견 하지 못 했 지만 지금 은 졸업 논문 을 쓸 때 데이터 의 양 이 커지 기 시 작 했 습 니 다. 또한 Rpackage 를 호출 하여 각종 데이터 유형 이 자주 발생 하 는데 list 가 정말 좋 은 것 을 알 게 되 었 습 니 다!
for 순환 을 사 용 했 기 때문에 레이 어 링 된 초대형 list 가 생 길 수 있 습 니 다. 이 럴 때 이 끼 워 넣 은 list 를 어떻게 정의 하 느 냐 가 중요 합 니 다.
구체 적 인 논리 관 계 는 사실 매우 간단 하 다. 머리 가 맑 고 자신 을 어 지 럽 히 지 않 으 면 몇 층 이 든 쉽게 해결 할 수 있다!
먼저 두 겹 의 것 을 예 로 들 면 된다.
제목 은 자줏빛:
같은 함수 에서 20 개의 data sets 를 무 작위 로 생 성하 고 모든 data set 는 K - means 로 분류 하 며 K 는 2 ~ 10 에서 한 번 씩 옮 겨 다 닙 니 다.결 과 는 list 에 저 장 됩 니 다.
첫 번 째 단계:
데이터 세트 를 만 드 는 함수 가 나 왔 습 니 다.20 개의 데 이 터 는 run 20 회 입 니 다. 무 작위 로 생 성 되 었 기 때문에 마지막 으로 얻 은 모든 data set 는 다 릅 니 다.그리고 이 20 개의 데이터 세트 를 하나의 list 에 저장 합 니 다.

art2  
 

왜 내 datasets 는 2 층 을 싸 야 합 니까? [i] 입 니까?사실 여기 리스트 가 끼 워 져 있어 요.내 가 생 성 한 함수 에 list 가 있 는 것 을 보 니 두 가지 요 소 를 포함 하고 하 나 는 $data: 생 성 된 원본 데이터 입 니 다.다른 하 나 는 $cvec: 원본 데이터 에 대응 하 는 실제 분류 입 니 다.그래서 저 는 큰 list 를 원 합 니 다. 이 20 개의 list 를 모두 포함 시 키 려 면 새 겨 야 합 니 다 ~ 두 개의 틀 - [i] 는 바로 두 층 입 니 다!(나 는 방금 [[[i]]]] 가 3 층 이 아 닐 까 생각 했다...............................................................
p. s. 다섯 번 째 생 성 결 과 를 추출 하려 면 datasets [[5]] 입 니 다. 물론 이 안에 두 가지 요소 가 포함 되 어 있 습 니 다. 원시 데이터 와 실제 분 류 를 추출 하려 면 datasets [[5] $data 입 니 다. 실제 분 류 를 추출 하려 면 datasets [5] 입 니 다.$cvec. 20 번 의 결 과 를 모두 추출 하려 면: 직접 datasets 입 니 다. 20 번 의 결과 에서 원본 데 이 터 를 추출 하려 면 그렇게 직접적 이지 않 습 니 다. for 순환 으로 1 ~ 20 번 의 datasets [[[i] $dat 를 하나씩 추출 해 야 합 니 다. 이 는 작은 list 에 두 가지 요소 가 포함 되 어 있 기 때문에 외부 에 list 를 끼 워 넣 는 것 이 20 번 반복 되 는 것 임 을 잘 이해 할 수 있 습 니 다.
두 번 째 단계:
그 다음 에 이 큰 datasets 에 대해 K - means, K = 2 ~ 10 을 실행 합 니 다. 여기 에는 두 개의 순환 이 있 습 니 다. 하 나 는 제 가 먼저 datasets 를 1 ~ 20 에서 한 번 가 야 한 다 는 것 입 니 다. 그리고 그 안에 있 는 모든 data set 는 K = 2 ~ 10 에서 K - means 의 결 과 를 계산 해 야 합 니 다. for 순환 이 잘 되 고 구체 적 인 프레임 워 크 는 대체적으로 다음 과 같 습 니 다. "??"

for (k in 2:10){
  for (i in 1:20){
    ??? 
 

K - means 의 문 구 는 i 와 k 가 동시에 포함 되 어 있 기 때문에 이 결 과 는 끼 워 넣 은 list 가 될 것 입 니 다. 제 가 이렇게 for 순환 을 쓰 면 안쪽 층 은 i = 1 ~ 20 이 고 바깥 층 은 k = 2 ~ 10 입 니 다. 그래서 k = 2 일 때 20 개의 data sets 를 한 번 순환 한 다음 k = 3, 다시 순환 합 니 다. k = 10 까지. 그래서 우 리 는 고정 k 일 때의 i = 1 ~ 20 의 run 결과, 첫 번 째 "??" 를 저장 해 야 합 니 다.i 를 포함해 야 합 니 다. 그리고 k 와 는 무관 합 니 다. 또한 kmeans 결과 가 되 돌아 오 는 list 에는 $cluster, $size 등 여러 가지 요소 가 포함 되 어 있 습 니 다. 따라서 이것 은 위의 datasets 저장 과 마찬가지 로 [[i], 2 층 이 어야 합 니 다!
첫 번 째 "??" 는 이미 해결 되 었 습 니 다. ks [[i] 라 고 가정 하면 k 가 고정 되 었 을 때 i = 1 ~ 20 의 결 과 를 저장 합 니 다. 지금 우 리 는 k = 2 ~ 10 을 순환 해 야 합 니 다. 목록 ks 의 밖 에 list 를 하나 더 끼 워 넣 는 것 과 같 습 니 다. k 순환 에 관 한 것 입 니 다. i 와 는 상관 이 없습니다. 그래서 다음 "??" 은 kmean [k] 이 어야 합 니 다.
결 과 는 이 렇 습 니 다.

kmean  
 

지금 안에 있 는 수 치 를 추출 하 는 방법 에 대해 말씀 드 리 겠 습 니 다. kmean 은 3 층 list 입 니 다. 가장 바깥쪽 에 있 는 층 은 k 와 관련 된 것 이 고 중간 에 있 는 층 은 i 와 관련 된 것 입 니 다. 안쪽 에 있 는 층 은 K - means 의 output 를 list 로 합 니 다.
그래서 kmean [k], k = 2 ~ 10 은 k = k 시 20 번 K - means 의 결과 입 니 다.
k = 2, 5 번 째 data sets 의 K - means 결 과 를 가 져 오 려 면 kmean [2] [5], k = 4, 1 번 째 data sets 의 K - means 가 얻 은 분류 결과 cluster: kmean [4] [[1] $cluster 입 니 다.
Done! 이것 은 제 개인 이 실제 작업 과정 에서 정리 한 것 이기 때문에 무슨 문제 가 있 으 면 같이 토론 하 는 것 을 환영 합 니 다 ~
Further studying——
factorial experiment design 에서 우 리 는 항상 여러 개의 factors 인 자 를 고려 합 니 다. 매개 인 자 는 몇 개의 levels 를 고려 합 니 다. 됐 습 니 다. 제 예 를 들 어 말씀 드 리 겠 습 니 다... 제 가 최근 에 한 일 에서 시작 과 같은 분류 데 이 터 를 생 성하 여 generate random clusters 를 생 성 해 야 합 니 다.
인자 실험 디자인 이기 때문에 저 는 세 가지 요 소 를 고려 했 습 니 다. (1) the number of clusters 는 모든 data 에 몇 개의 그룹 이 있 습 니 다. 처음에 예 를 들 어 3 개 만 있 습 니 다. 여기 서 제 가 정 한 level 은 2, 3, 5 입 니 다. (2) the number of points in each cluster 는 각 그룹 에 얼마나 적은 지, 정 한 level 은 25, 100, 225 입 니 다. and (3)the degree of separation 그룹 과 그룹 사이 의 거리 가 먼 지 가 까 운 지 함수 안에 sepVal 이 정의 할 수 있 습 니 다. 저 는 0.01 과 0.021 을 정 했 습 니 다. 마지막 으로 두 번 반복 합 니 다. 모든 결 과 를 하나의 list 에 저장 합 니 다.
티 티 를 잘 모 르 는 것 같 아 요. 코드 를 보 세 요. 제 가 표현 하고 싶 은 말 은 몇 개의 요 소 를 고려 하 든 list 는 몇 층 을 추가 하 든 위의 방법 에 따라 한 층 씩 겹 치면 된다 는 뜻 입 니 다. 중요 한 것 은 매번 층 대표 의 의 미 를 알 아 내 는 것 입 니 다. 그리고 원 하 는 값 을 어떻게 뽑 는 지 알 아 내 는 것 입 니 다.

cluster 
 

보충: 여러 겹 으로 포 함 된 목록 에서 모든 수 치 를 직접 꺼 내 는 방법
주어진 목록

s = [[[[[[1, 1]], [[9, 1]]], [[5, 1]]], [[[3, 1]], [[7, 1]]]], [[[[2, 1]], [[6, 1]]], [[[4, 1]], [[8, 1]]]]]
s[0]   [[[[[1, 1]], [[9, 1]]], [[5, 1]]], [[[3, 1]], [[7, 1]]]]
s[1]   [[[[2, 1]], [[6, 1]]], [[[4, 1]], [[8, 1]]]]

모든 외부 목록 은 2 개의 키 목록 을 포함 하고 있 으 며, s [0] 는 s [1] 보다 한 층 더 포함 되 어 있 습 니 다.
해결 방안
방법
문자열 을 바 꾼 후 replace 를 사용 하여 필요 하지 않 은 값 을 바 꿉 니 다. 예 를 들 어

b = str(s).replace('[', '').replace(']', '').replace(' ', '').split(',')
for m,n in enumerate(b):
    if m%2 == 0:
        result.append(int(n))

여기 서 수요 에 따라 모든 가장 안쪽 목록 의 2 차원 값 을 삭제 하 였 다.
방법
아름 다운 해법 은 재 귀적 으로 값 을 얻 는 것 이다.

def flat(nums):
    res = []
    for i in nums:
        if isinstance(i, list):
            res.extend(flat(i))
        else:
            res.append(i)
    return res
result = flat(s)

결과:
[1, 1, 9, 1, 5, 1, 3, 1, 7, 1, 2, 1, 6, 1, 4, 1, 8, 1]
나머지 1 을 빼 고 다음 결과 와 일치 합 니 다.
결과:
result
Out[157]: [1, 9, 5, 3, 7, 2, 6, 4, 8]
tips
이 서열 의 출처 는 하나의 알고리즘 문제 입 니 다. 요구 하 는 것 은 1 부터 n 까지 정수 서열 을 찾 아서 임의의 중간 수 곱 하기 2 는 양쪽 에서 각각 하나의 수의 합 (즉, aj * 2! = ai + ak, 그 중에서 i

좋은 웹페이지 즐겨찾기