2017-11-08 5 views
-1

아래의 벡터를 편집하는 가장 간단한 방법을 모색 중입니다. A와 B 값을 NA로 테스트 값 < 2 (0 또는 1)로 바꾸고 테스트 열을 제거하고 싶습니다. 나는 우리가 conditionals없이 그들을 대체 할 수 있다는 것을 안다. 그러나이 예제는 훨씬 더 큰 데이터 프레임으로부터 문제를 설명하기위한 것이다.R 최적 조건부 편집

> df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0))) 

그것은 다음과 같습니다

A B testA testB 
100 12 17 5 
30 40 1 4 
200 100 120 1 
80 70 400 10 
    5 50 70 0 

그것은 다음과 같아야합니다

A B 
100 12 
NA 40 
200 NA 
80 70 
    5 NA 

사전에 감사합니다!

+0

값을 조건부로 바꾸는 방법에는 여러 가지가 있습니다. https://stackoverflow.com/a/41585689/5088194 –

답변

0

@ Jens Leerssen이 지적하는 것처럼, 수많은 방법이 있습니다. 내가 볼 수있는 가장 간단한 방법은 각 열에 대해 조건부를 갖는 것입니다. 당신이 그것을 확장하려면, * 적용하거나 루프 사용

with(df, ifelse(testA < 2, NA, A)) 

이 내 상자 (OSX에 16 기가 바이트, I5) 작동 방식을 많이 다루는 데이터 개봉하지만 확인 :

df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0))) 

# create two vectors, one for each set of columns 
vec_nam = names(df) 
vec_split = tolower(grepl('^test.*', vec_nam)) # tolower() to avoid conflict with TRUE/FALSE 
list_df = split(vec_nam, vec_split) 

num_comparisons = length(list_df$false) 
list_return = vector('list', length = num_comparisons) 

for (i in 1:num_comparisons){ 
    col_test = list_df$true[i] 
    col_valu = list_df$false[i] 

    list_return[[i]] = ifelse(df[, col_test] < 2, NA, df[, col_valu]) 
} 

final_df = setNames(do.call(cbind.data.frame, list_return), list_df$false) 
+0

고마워요.하지만 실제로 루프를 찾고 있는데, 실제로는 데이터가 훨씬 큽니다. . 또한 여러 개의 열 쌍을 사용하려는 경우 메모리 사용이 중요하므로 –

+0

? 그래서 당신은 testZ, Z, N이 필요하다. 만약 testZ <= N이라면 NA, 그렇지 않으면 Z? 메모리에 대해 걱정이된다면 새로운 vector/df 컬럼을 생성하는 대신 함수가 컬럼을 대체 할 것입니다. – bringtheheat

+0

그것이 제가 다루고있는 문제입니다. 문제를 해결하는 방법을 찾았지만 새로운 벡터를 만들면 매우 효율적이지 않습니다. –

0
> df2 <- data.frame(A= with(df, ifelse(df$testA < 2, NA, df$A)), B= with(df, ifelse(df$testB < 2, NA, df$B))) 

주어진 예제에서 작동하지만 크기를 조정하는 것도 불가능합니다. 나는 그것이 effiecient dubt.