2016-10-12 46 views
0
縱列

我有一個數據幀,看起來像這樣:更換變化值在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應減去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 

生成數據幀

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

回答

1

我們創建基於對「X1」和「X2」兩個指標,並根據這些指標

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我們不是親手設置新手。如果你看看這個解決方案,列名是用'grep'索引的 – akrun

0

我們必須分配值的代碼兩個變量的條件,然後在這種情況下的一系列反應爲TRUE。

# 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希望這可能有用 –