当谈到R中的时间序列数据分析时,一般新手。我在为我正在做的复制项目将一些Stata代码转换为R代码时遇到了麻烦。
Stata代码和Stata代码(来自原始分析)的目的如下:
#### Delete extra yearc observations with different wartypes #####
drop if yearc==yearc[_n+1] & wartype!="CIVIL"
drop if yearc==yearc[_n-1] & wartype!="CIVIL"所以,翻译过来,我保留了国家正在发生内战的行,并删除了在同一年中发生了州际战争的行。
我已经命名了数据对象(即数据集)
mywar在R.
我假设我以某种方式执行了一个条件ifelse语句,或者类似的语句,例如:
invisible(mywar$yearc <- ifelse(mywar$yearc==n-1 | mywar$yearc==n+1 | mywar$wartype!=civil, NA,
mywar$yearc)) # I am assuming I cannot condition ifelse statements like this; but, this is how I imagine it
mywar <- mywar[!is.na(mywar$yearc),]EDIT:举个例子
> b <- c(1970, 1970, 1970, 1971, 1982, 1999, 1999, 2000, 2001, 2002)
> c <- c("inter", "civil", "intra", "civil", "civil", "inter", "civil", "civil", "civil", "civil")
> df <- data.frame(b,c)
> df$j <- ifelse(df$b==n-1 & df$b==n+1 & df$c!="civil", NA, df$b)
> df
b c j
1 1970 inter 1970
2 1970 civil 1970
3 1970 intra 1970
4 1971 civil 1971
5 1982 civil 1982
6 1999 inter 1999
7 1999 civil 1999
8 2000 civil 2000
9 2001 civil 2001
10 2002 civil 2002因此,我试图为第1、3和6行创建NAs,因为它们在我关于内战开始的逻辑回归中是重复的年份(无论如何定义,我对战争之间和战争内部都不感兴趣),这样我就可以从我的数据集中删除这些行。这里,我刚刚重新创建了行b。(请注意,这个虚构的数据中缺少的是国家ids。但假设这十个条目代表同一个国家(例如,索马里)。因此,我感兴趣的是如何在包含28,000行的数据集中删除这些类型的行。
发布于 2015-06-05 08:01:03
dplyr也是一个好方法--你只需要“保留”而不是“丢弃”。
library(dplyr)
filter(df, (yearc != lead(yearc, 1) & yearc != lag(yearc, 1)) | wartype == "CIVIL")发布于 2015-02-04 01:25:45
您关注的是Stata的if限定符,但听起来您只是想对数据帧进行子集设置--因此您在Stata中使用了drop命令。我也在R之前学习了Stata,并感到困惑,因为我非常依赖Stata中的if限定符,并立即在R中使用ifelse。但是,后来我意识到R中更相关的技术是围绕子集的。有一个subset()命令,但大多数人更喜欢使用括号设置子集(参见下面的代码)。
在你的原始问题中,你会问如何做两件事:
示例数据
b <- c(1970, 1970, 1970, 1971, 1982, 1999, 1999, 2000, 2001, 2002)
c <- c("inter", "civil", "intra", "civil", "civil", "inter", "civil", "civil", "civil", "civil")
df <- data.frame(b,c)
df
b c
1 1970 inter
2 1970 civil
3 1970 intra
4 1971 civil
5 1982 civil
6 1999 inter
7 1999 civil
8 2000 civil
9 2001 civil
10 2002 civil1.删除观测值如果要删除列C中不是“民事”的观测值,则可以将数据框子集设置为仅保留那些“民事”的案例:
df2 <- df[df$c=="civil",]
df2
b c
2 1970 civil
4 1971 civil
5 1982 civil
7 1999 civil
8 2000 civil
9 2001 civil
10 2002 civil上面的代码创建了一个新的数据框df2,它是df的子集,但您也可以完全覆盖原始数据框:
df <- df[df$c=="civil",] 或者,你可以生成一个新的,然后删除旧的,如果你不喜欢你的工作区杂乱的大量数据框:
df2 <- df[df$c=="civil",]
rm(df)2.将观测值标记为丢失的如果您想在C列中标记不是"civil“的观测值,可以通过将它们覆盖为NA来实现:
df$c[df$c != "civil"] <- NA
df
b c
1 1970 <NA>
2 1970 civil
3 1970 <NA>
4 1971 civil
5 1982 civil
6 1999 <NA>
7 1999 civil
8 2000 civil
9 2001 civil
10 2002 civil然后,您可以使用列表删除(参见na.omit()命令)从您正在执行的任何分析中删除案例。
旁注:当b列是重复的,c列是“内部”或“内部”时,你的原始Stata代码寻求子集。但是,样本数据的表示方式似乎是多余的,这就是为什么我上面的解决方案只看列c。
df <- df[order(df$b, df$c),]
df$duplicate <- duplicated(df$b)
df2 <- df[df$c=="civil" & df$duplicate==FALSE,] 哪一个
发布于 2014-11-04 12:10:22
尝试将您的|操作符更改为&。以下是一些虚构的数据:
R> b <- c(rep(1:4, each=3))
R> c <- 1:length(b)
R> df <- data.frame(c,b)
R> df$j <- ifelse(df$b != 2 & df$b != 3 & df$b != 1, NA, df$b)
R> df
c b j
1 1 1 1
2 2 1 1
3 3 1 1
4 4 2 2
5 5 2 2
6 6 2 2
7 7 3 3
8 8 3 3
9 9 3 3
10 10 4 NA
11 11 4 NA
12 12 4 NA代码mywar <- mywar[!is.na(mywar$yearc),]的最后一行应该也可以正常工作
https://stackoverflow.com/questions/26727381
复制相似问题