1

いくつかのデータセットをマージしている最中に、特定の変数の値が欠落しているデータフレームのすべての行を削除しようとしています(当面は他の列のいくつかにNAを保持したいと思います)。私は次の行を使用しました:

data.frame <- data.frame[!is.na(data.frame$year),]

これにより、のNAを持つすべての行が正常に削除されますyear(他の行は削除されません)が、以前はデータがあった他の列は完全にNAになりました。つまり、欠落していない値はNAに変換されています。ここで何が起こっているのかについて何かアイデアはありますか?私はこれらの代替案を試しましたが、同じ結果が得られました。

data.frame <- subset(data.frame, !is.na(year))

data.frame$x <- ifelse(is.na(data.frame$year) == T, 1, 0);
data.frame <- subset(data.frame, x == 0)

is.na間違って使用していますか?is.naこのシナリオに代わるものはありますか?どんな助けでも大歓迎です!

編集これは問題を再現する必要があるコードです:

#data
tc <- read.csv("http://dl.dropbox.com/u/4115584/tc2008.csv")
frame <- read.csv("http://dl.dropbox.com/u/4115584/frame.csv")

#standardize NA codes
tc[tc == "."] <- NA
tc[tc == -9] <- NA

#standardize spatial units
colnames(frame)[1] <- "loser"
colnames(frame)[2] <- "gainer"
frame$dyad <- paste(frame$loser,frame$gainer,sep="")
tc$dyad <- paste(tc$loser,tc$gainer,sep="")
drops <- c("loser","gainer")
tc <- tc[,!names(tc) %in% drops]
frame <- frame[,!names(frame) %in% drops]
rm(drops)

#merge tc into frame
data <- merge(tc, frame, by.x = "year", by.y = "dyad", all.x=T, all.y=T) #year column is duplicated in       this process. I haven't had this problem with nearly identical code using other data.

rm(tc,frame)

#the first column in the new data frame is the duplicate year, which does not actually contain years.   I'll rename it.
colnames(data)[1] <- "double"

summary(data$year) #shows 833 NA's

summary(data$procedur) #note that at this point there are non-NA values

#later, I want to create 20 year windows following the events in the tc data. For simplicity, I want to remove cases with NA in the year column.

new.data <- data[!is.na(data$year),]

#now let's see what the above operation did
summary(new.data$year) #missing years were successfully removed
summary(new.data$procedur) #this variable is now entirely NA's
4

2 に答える 2

2

実際の問題はあなたにあると思いますmerge

マージしてデータをに入れた後data、次の場合:

# > table(data$procedur, useNA="always")

#   1      2      3      4      5      6   <NA> 
# 122    112    356     59     39     19 192258 

には、これらの多くの(122+112...+19)値があることがわかりますdata$procedur。ただし、これらの値はすべてに対応していdata$year = NAます。

> all(is.na(data$year[!is.na(data$procedur)]))
# [1] TRUE # every value of procedur occurs where year = NA

したがって、基本的に、でprocedurチェックしている行を削除したため、のすべての値も削除されNAますyear

この問題を解決するには、次のように使用する必要があると思いますmerge

merge(tc, frame, all=T) # it'll automatically calculate common columns
# also this will not result in duplicated year column.

このマージで目的の結果が得られるかどうかを確認してください。

于 2013-02-19T22:29:31.313 に答える
0

試してみてくださいcomplete.cases

data.frame.clean <- data.frame[complete.cases(data.frame$year),]

...ただし、上記のように、よりわかりやすい名前を選択することをお勧めします。

于 2013-02-19T21:52:13.000 に答える