2016-07-30 4 views
-2

저는 CFM_1에서 CFM_100까지 100 개의 변수를 설정했습니다. 각 변수는 1,2,3 또는 4의 값을 가질 수 있습니다. TEMP라는 새 변수를 만들려고합니다.이 변수는 CFM_1에서 CFM_100 변수 중 하나에 1 또는 2 값이 있으면 값 1을 갖습니다. 보다 효율적인 솔루션으로 편집이R 프로그래밍 - 변수 100 개를 기반으로하는 값에서 새 변수 만들기

+0

dplyr 라이브러리를 사용하는 것입니다. – shayaa

+0

답변 해 주셔서 감사합니다. 특히 Shayaa. 놀라운 하나. –

+0

답변에 가까운 확인란을 클릭하면 가장 도움이 된 항목을 선택할 수 있습니다. – shayaa

답변

1

이 예제에서는 임의의 변수가이 행렬의 단일 위치에서 1 또는 2를 생성한다는 확률이 1/2이기 때문에 약간 바보입니다. 행렬의 각 열에 대해 하나씩이 열 번을 수행하면 주어진 행에 대해 임시 변수가 TRUE가 될 확률이 1 % 미만입니다. 어쨌든, 여기갑니다.

df <- data.frame(replicate(5, sample(1:4, 10, replace = TRUE))) 
names(df) <- paste("CFM", 1:ncol(df), sep = "_") 

데이터 프레임은 제외하고자하는 데이터 프레임에서 다른 변수를 가지고, 지금은 가정하자이

df 
    CFM_1 CFM_2 CFM_3 CFM_4 CFM_5 
1  2  2  1  4  4 
2  2  2  1  3  4 
3  2  1  1  3  3 
4  1  2  3  3  2 
5  3  4  2  4  4 
6  3  4  4  2  2 
7  3  1  3  2  2 
8  1  2  4  1  2 
9  3  2  1  3  2 
10  1  3  1  4  3 

것 같습니다. 다음과 같이 cbind를 사용하여 이러한 열을 데이터 프레임 앞에 추가합니다.

df <- cbind(replicate(3,sample(1:4, 10, replace = T)), 
     df, 
     replicate(3,sample(1:4, 10, replace = T))) 
names(df)[1:3]<- paste0("Var",1:3) 
names(df)[9:11] <- paste0("Var", 9:11) 

는 이제 DF 당신은 각 행의 데이터의 경우 확인하기 위해 데이터 행에 어떤 기능을 적용하여 변수에 임시로 값을 지정할 수 있습니다이

df 
    Var1 Var2 Var3 CFM_1 CFM_2 CFM_3 CFM_4 CFM_5 Var9 Var10 Var11 
1  4 1 4  4  1  3  1  3 1  3  1 
2  4 2 3  2  4  3  2  1 2  3  3 
3  4 2 4  4  2  1  1  2 2  3  2 
4  4 4 2  4  4  1  3  2 2  1  2 
5  4 2 1  4  4  4  1  1 2  2  2 
6  1 4 2  3  1  4  4  2 1  3  2 
7  3 2 4  4  2  3  4  3 1  1  1 
8  1 3 3  3  3  2  3  3 2  2  2 
9  3 3 2  1  4  3  4  1 4  2  1 
10 2 1 1  2  1  2  4  1 2  1  1 

처럼 보인다 1 또는 2 중 하나입니다.하지만 먼저 어떤 열이 데이터인지 알아야합니다.

agrep 함수를 사용하여 근사 문자열 일치를 수행 할 수 있습니다. 당신이

예상대로
cfm_cols <-agrep("CFM", names(df)) 
cfm_cols 
[1] 4 5 6 7 8 

temp <- apply(df[,cfm_cols], 1, function(x) any(x) %in% c(1,2)) 
temp 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

을 사용하는 경우 그것은 그들이 모든 TRUE입니다, 데이터 프레임의 이름이 문자를 그들 "CFM" 있던 당신을 말할 것이다. 당신이 좋아하면

또 다른 해결책은, 나는 당신의 의견에 따라 내 대답을 편집이

library(dplyr) 
df%>% rowwise() %>% select(contains("CFM")) %>% 
    mutate(TEMP = any(.) %in% c(1,2)) 
+0

보기 확률에 관해서, OP는 변수가 무작위라고 말하지 않았다. 이 데이터 세트에서 값의 분포를 알 수 없습니다. 3보다 작은 값은 극히 드문 경우가 있습니다. – rosscova

+0

@rosscova 감사합니다! 나는 무작위로 표본을 추출한 이후로 "나의 본보기"가 아니라 "당신의 본보기"를 의미했습니다. 어쨌든, 저는 두 가지 효율적인 방법을 제공했다고 생각합니다. – shayaa

+0

Ahh, 알겠습니다.) ... 그렇습니다. 당신의 대답은 특히 'dplyr', 좋은 일로 매우 효율적입니다. 비슷한 것을 시도했지만 작동하지 못했습니다. 하나 더하기. – rosscova

1

에 적합한 R 코드는, 부분적으로

첫 번째 줄은 여기에 (당신이 관심에만 열을 추출하여 임시 dataframe을 만듭니다 ... @의 shayaa의 대답에서 조달/도난 우리가 함께 할 때 우리는) ​​그것을 제거 할 수 있습니다 :

new <- subset(df, select = paste0("CFM_", seq_len(100))) 

df$TEMP <- 1 * (apply(new, 1, min) <= 2) 

rm(new) 

그래서 방금 지정한 값 중 하나에 대한 각각의 전체 행을 검색하는, 부울 결과를 숫자로 변환하고 원래 데이터 프레임에 배치합니다.

+0

죄송합니다. 이것을 해독 할 수 없습니다. 가능하면 조금 자세하게 설명하십시오. CFM 변수는 어디에서 볼 수 있습니까? –

+0

죄송합니다. 저는 여러분이 언급 한 "100 개의 변수"가 100 열의 데이터 프레임에있는 열이라고 가정한다는 사실을 포함해야합니다. 필자가 제공 한 코드는 모든 열을 조사하므로 열을 이름으로 호출 할 필요가 없습니다. 계산에서 제외해야 할 열이 더 많으면 코드가 조금 변경됩니다. – rosscova

+0

예 상황은 약 300 열과 데이터 프레임이 있지만 그 중 100 개에만 관심이 있습니다. 나는 너의 설명을 이해했다. 하지만 내가 관심있는 사람들 만 포함하고 싶다면 문법의 변화를 알려주시겠습니까? 도움을 많이 주셔서 감사합니다. –

관련 문제