2016-11-29 79 views
0

取代我有以下的數據幀u如何在數據幀列基於某些條件

u<- data.frame(a=c("x1","x2","x3","x4","x5","x6","x7"),b=c(2005,2006,2007,2008,2009,2010,2011),c1=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5),c2=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5),c3=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5)) 
a b  c1 c2 c3 
x1 2005 0.5 0.5 0.5 
x2 2006 0.5 0.5 0.5 
x3 2007 0.5 0.5 0.5 
x4 2008 0.6 0.6 0.6 
x5 2009 0.7 0.7 0.7 
x6 2010 0.9 0.9 0.9 
x7 2011 0.5 0.5 0.5 

我想在列替換值的值(C1,C2,C3)基於列B值。因此,如果在列B中的值小於2008,替換在列(C1,C2,C3)以1,2和3所得到的數據幀是

a b  c1 c2 c3 
x1 2005 1 2 3 
x2 2006 1 2 3 
x3 2007 1 2 3 
x4 2008 0.6 0.6 0.6 
x5 2009 0.7 0.7 0.7 
x6 2010 0.9 0.9 0.9 
x7 2011 0.5 0.5 0.5 
+2

嘗試'u [which(u $ b <2008),3:5] < - rep(1:3,each = 3)' – count

回答

1

不使用庫,或者如果你需要它推廣到許多C柱,你可以這樣做:

u <- data.frame(a=c("x1","x2","x3","x4","x5","x6","x7"), 
b=c(2005,2006,2007,2008,2009,2010,2011), 
c1=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5), 
c2=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5), 
c3=c(0.5,0.5,0.5,0.6,0.7,0.9,0.5)) 

然後用方括號表示法子集,並指定了三列一次:

u[u$b<2008,3:5] <- data.frame(1,2,3) 
u 
    a b c1 c2 c3 
1 x1 2005 1.0 2.0 3.0 
2 x2 2006 1.0 2.0 3.0 
3 x3 2007 1.0 2.0 3.0 
4 x4 2008 0.6 0.6 0.6 
5 x5 2009 0.7 0.7 0.7 
6 x6 2010 0.9 0.9 0.9 
7 x7 2011 0.5 0.5 0.5 
0

嘗試此

library(magrittr)

u$c1 %<>% ifelse(u$b < 2008, 1, .)

u$c2 %<>% ifelse(u$b < 2008, 2, .)

u$c3 %<>% ifelse(u$b < 2008, 3, .)

0

我碰巧發現這更直觀,但只是一個偏好。

u$c1[u$b < 2008] <- 1 u$c2[u$b < 2008] <- 2 u$c3[u$b < 2008] <- 3

0

和另一種方式......

library(dplyr) 
u %>% 
    mutate(c1 = ifelse(b < 2008, 1, c1), 
     c2 = ifelse(b < 2008, 2, c2), 
     c3 = ifelse(b < 2008, 3, c3) 
     )