0

「年」、「会社のコード」、「def - 会社がデフォルトかどうか」の列を含むデータセットがあります。私が抱えている問題は、「def」の列にデフォルトの「1」のシーケンスが含まれていることです。これらの「1」は、会社が運営されているすべての年です。たとえば、会社は 1990 年から営業しており、2000 年に倒産しました。この会社は昨年、つまり 2000 年に債務不履行に陥っていますが、この列には「1」の 10 倍が含まれています。コード」は、1990 年から 2000 年の間ではなく、2000 年の「1」のみのデフォルト エントリです。「def」列から「1」のシーケンスを削除するにはどうすればよいですか(現在はdata.frameとして持っています)、「1」の最後のエントリを残すだけです

私はビンを作成することから始めました:

split(data.frame[dataFrame$def == 1, ], dataFrame[dataFrame$def == 1, 'coKey]) 

ここで、「coKey」は「会社コード」です。

最後の観測を残してデータを消去することはできませんでした。また、ビンを元のデータ フレームに戻すこともできませんでした。これを行う手順が古すぎたからです。

助けてくれてどうもありがとう、どうもありがとう。

サンプルデータはこちら。

dataFrame <- structure(list(fyear = 1981:1986, 
   gvkey = c(1004L, 1004L, 1004L, 1004L, 1004L, 1004L), 
   def = structure(c(1L, 1L, 1L, 1L, 1L, 1L ), 
   .Label = c("0", "1"), class = "factor")), 
   .Names = c("fyear", "coKey", "def"), 
   row.names = c(NA, 6L), class = "data.frame")
4

3 に答える 3

1

最初にデータを分割し、def列に1がある場合は、最大年以外のすべてを0に変更してから、それを結合する必要があるようです。

l <- split(dataFrame, data.Frame$coKey)
l <- lapply(l, function(x){ 
               if (1 %in% x$def) x$def[x$fyear != max(x$fyear)] <- 0
               x})
data.Frame <- do.call(rbind, l)
于 2012-12-06T16:35:34.350 に答える
1

あなたのコメントを読んだ後、私はこれがあなたが望むものだと信じていますが、私にはわかりません。

#Example data
df <- data.frame(fyear=rep(1981:1990,2),
                 gvkey=rep(c(1004,1005),each=10),
                 DEF=c(rep(0,2),rep(1,3),rep(0,5),rep(1,7),rep(0,3)))


library(plyr)

#function to apply by company
myfun <- function(x) {
  #check if last value is a 1
  if (last(x)==1) {
   res <- x*0
   res[length(res)] <- 1
  } else {
    #seach for difference between values == -1
    res <- as.numeric(c(diff(x),0)==-1)
  }
  res  
}

#split-apply-combine
ddply(df,~gvkey,transform,DEF2 = myfun(DEF))

結果:

  fyear gvkey DEF DEF2
1   1981  1004   0    0
2   1982  1004   0    0
3   1983  1004   1    0
4   1984  1004   1    0
5   1985  1004   1    1
6   1986  1004   0    0
7   1987  1004   0    0
8   1988  1004   0    0
9   1989  1004   0    0
10  1990  1004   0    0
11  1981  1005   1    0
12  1982  1005   1    0
13  1983  1005   1    0
14  1984  1005   1    0
15  1985  1005   1    0
16  1986  1005   1    0
17  1987  1005   1    1
18  1988  1005   0    0
19  1989  1005   0    0
20  1990  1005   0    0
于 2012-12-06T16:36:26.790 に答える
1

あなたがしようとしているのは、111「s」の文字列を単一の1. その場合は、次のようにする必要があります。

ステップバイステップで分解:

# Likely they're factors.  Convert to strings.  # Dont convert to numeric if your data may have a series of approx 20+ 1's 
dataFrame$def <- as.character(dataFrame$def)

# Find which ones have any 1's at all
indxOf1s <- grep("1", dataFrame$def)

# Convert those to a single 1
  x <- gsub("1", "0", dataFrame$def[indxOf1s])    
  dataFrame$def[indxOf1s] <-  paste0(substr(x, 1, nchar(x)-1), rep(1, length(x)) )

dataFrame

        BEFORE      &          AFTER

    Comp    def             Comp    def
  1    A   1111           1    A   0001
  2    B   1111           2    B   0001
  3    C      0           3    C      0
  4    D 111111           4    D 000001
  5    E      1           5    E      1
  6    F 111111           6    F 000001
  7    G 111111           7    G 000001
  8    H  11111           8    H  00001
于 2012-12-06T16:03:00.140 に答える