2016-10-12 3 views
0

У меня есть dataframe, который выглядит следующим образом:Замена изменения значения столбцов в DF

x1 y1 z1 x2 y2 z2 
1 6 7 8 5 4 10 
2 7 8 9 6 5 11 
3 8 9 10 7 6 12 
4 9 10 11 8 7 13 
5 10 11 12 9 8 14 
6 11 12 13 10 9 15 

Теперь я хочу, чтобы изменить значение в x1 и x2 в соответствии с этим правилом: Каждое значение в x1 или x2, что больше 8, следует вычесть на восемь, каждое значение в x1 или x2, которое меньше 8 или меньше, должно быть заменено на NA. Кроме того, если значение в x1 или x2 заменено на NA y1/y2, а z1/z2 также должно быть установлено на NA. Блок данных должен выглядеть так.

x1 y1 z1 x2 y2 z2 
1 NA NA NA NA NA NA 
2 NA NA NA NA NA NA 
3 NA NA NA NA NA NA 
4 1 10 11 NA NA NA 
5 2 11 12 1 8 14 
6 3 12 13 2 9 15 

Код для генерации этого dataframe

df1<-data.frame("x1"=6:11,"y1"=7:12,"z1"=8:13,"x2"=5:10,"y2"=4:9,"z2"=10:15) 

ответ

1

Мы создаем два индекса, основанные на «x1» и «х2» и назначьте значения на основе этих индексов

i1 <- df1$x1 <=8 #x1 index 
i2 <- df1$x2 <=8 #x2 index 
nm1 <- grep("1$", names(df1)) #column index for suffix 1 in column names 
nm2 <- grep("2$", names(df1)) #column index for suffix 2 in column names 


df1[i1,nm1] <- NA #set the values for suffix 1 columns to NA 
df1[i2, nm2] <- NA #set the values for suffix 2 columns to NA 
df1[c('x1', 'x2')] <- df1[c('x1', 'x2')] - 8 #subtract 8 from the 'x' columns 
df1 
# x1 y1 z1 x2 y2 z2 
#1 NA NA NA NA NA NA 
#2 NA NA NA NA NA NA 
#3 NA NA NA NA NA NA 
#4 1 10 11 NA NA NA 
#5 2 11 12 1 8 14 
#6 3 12 13 2 9 15 
+0

Этот ответ работает для этого конкретного случая, но я не хочу, чтобы установить NA-х вручную. – PCK1992

+0

@ PCK1992 Мы не устанавливаем NAs вручную. Если вы посмотрите на решение, имена столбцов индексируются с помощью 'grep' – akrun

0

У нас есть условие в двух переменных, а затем ряд реакций в случае этих условий ИСТИНА.

# Activate the condition for x1 and x2 
df1$x1 <- ifelse(df1$x1 > 8, df1$x1 - 8, NA) 
df1$x2 <- ifelse(df1$x2 > 8, df1$x2 - 8, NA) 

# Reaction of other variables to a external condition 
df1$y1 <- ifelse(df1$x1 > 8, NA, df1$y1) 
df1$y2 <- ifelse(df1$x2 > 8, NA, df1$y2) 

# Reaction of other variables to a external condition 
df1$z1 <- ifelse(df1$x1 > 8, NA, df1$z1) 
df1$z2 <- ifelse(df1$x2 > 8, NA, df1$z2) 
0
library(dplyr) 

df[,c("x1","x2")] <- sapply(df[,c("x1","x2")],function(x)ifelse(x>8,x-8,NA)) 


df %>% 
    mutate(y1=replace(y1,which(x1%in%NA),NA))%>% 
    mutate(z1=replace(z1,which(x1%in%NA),NA))%>% 
    mutate(y2=replace(y2,which(x2%in%NA),NA))%>% 
    mutate(z2=replace(z2,which(x2%in%NA),NA)) 

    x1 y1 z1 x2 y2 z2 
1 NA NA NA NA NA NA 
2 NA NA NA NA NA NA 
3 NA NA NA NA NA NA 
4 1 10 11 NA NA NA 
5 2 11 12 1 8 14 
6 3 12 13 2 9 15 
+0

@ PCK1992 Надеюсь, что это может быть полезно –

Смежные вопросы