2017-07-19 9 views
0

私はこのデータを持っています。特定の条件の列を作成するR

OPENING CLOSE 
2007  2008 
2009  2010  
2004  NA 

と私はループまたはlapply機能をしたいのですが中にこのコラム

OPENING CLOSE Y2004 Y2005 Y2006 Y2007 Y2008 Y2009 Y2010 
2007  2008      1  1 
2005  2008   1  1  1  1         
2004  NA 1  1  1  1  1  1  1 

もし機能をステップで、このコラムステップを作成することが可能であることを確認したいと思います。

また、特定の条件を使用してこの列(S〜)を作成します。

列(Y2007)が1で、列は3年前に1(Y2005)、 新しい列(S2007)は、私がスクリプトを作成するにはどうすればよい1、そうでなければ0を

OPENING CLOSE Y2004 Y2005 Y2006 Y2007 Y2008 Y2009 Y2010 | S2007 S2008 S2009 
2007  2008      1  1    | 0  0  0 
2005  2008   1  1  1  1    | 1  1  0 
2004  NA 1  1  1  1  1  1  1 | 1  1  1 

ですされている場合R?

答えて

1

tidyverseからの溶液。 dt3が最初の希望出力、dt5が2番目の希望出力です。ここでloopsを使用する必要はありません。

# Create example data frame 
dt <- read.table(text = "OPENING CLOSE 
2007  2008 
       2005  2008  
       2004  NA ", 
       header = TRUE, stringsAsFactors = FALSE) 

# Load package 
library(tidyverse) 

dt2 <- dt %>% 
    mutate(ID = 1:n(), EndYear = ifelse(is.na(CLOSE), 2010, CLOSE)) %>% 
    # Create year range list 
    mutate(YearRange = map2(OPENING, EndYear, `:`)) %>% 
    # Unnest the list column 
    unnest() %>% 
    mutate(YearRange = paste0("Y", YearRange)) %>% 
    mutate(Value = 1) %>% 
    # Spread based on YearRange and Value 
    spread(YearRange, Value) 

# Desired output 1 
dt3 <- dt2 %>% 
    arrange(ID) %>% 
    select(-ID, -EndYear) 

dt4 <- dt2 %>% 
    gather(YearRange, Value, Y2004:Y2010) %>% 
    arrange(ID) %>% 
    group_by(ID) %>% 
    # Set the lag year here, using 3 years ago as an example 
    mutate(Value2 = lag(Value, 2)) %>% 
    # Evaluate the condition bewteen one year and 3 years ago 
    mutate(Value3 = ifelse(Value %in% 1 & Value2 %in% 1, 1, 0)) %>% 
    mutate(YearRange = sub("Y", "S", YearRange)) %>% 
    select(ID, YearRange, Value3) %>% 
    # Filter for S2007 o S2009 
    filter(YearRange %in% paste0("S", 2007:2009)) %>% 
    spread(YearRange, Value3) 

# Desired output 2 
dt5 <- dt2 %>% 
    left_join(dt4, by = "ID") %>% 
    arrange(ID) %>% 
    select(-ID, -EndYear) 
+0

私が見てきたので、これは私にとって偉大な答えの一つです!ありがとう。ああ!コードの下に追加のフィルタを設定したいと思います(filter(YearRange%in%〜))。私はサブセットY2007〜Y2009をしたいので、そのコードの下にコードを書いたが、それはうまくいかない。 2つの方法でフィルタリングするコードを修正するにはどうすればよいですか? –

0

ベースRのバージョン:

rng <- range(unlist(dat), na.rm=TRUE) 
rng <- rng[1]:rng[2] 

dat[paste0("Y",rng)] <- t(mapply(
    function(op,cl,rn) rn >= op & (rn <= cl | is.na(cl)), 
    dat[["OPENING"]], 
    dat[["CLOSE"]], 
    list(rng) 
)) 

# OPENING CLOSE Y2004 Y2005 Y2006 Y2007 Y2008 Y2009 Y2010 
#1 2007 2008 FALSE FALSE FALSE TRUE TRUE FALSE FALSE 
#2 2009 2010 FALSE FALSE FALSE FALSE FALSE TRUE TRUE 
#3 2004 NA TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
関連する問題