关于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),]
编辑: 所以也许是一个例子
> 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行创建NA,因为它们在内战开始时的逻辑回归中是重复的年份(我对内部和内部战争不感兴趣,无论如何定义)这样我就可以从我的数据集中删除这些行。在这里,我只是重新创建了第b行。 (注意,这些组成数据缺少的是国家ID。但假设这十个条目代表同一个国家(例如,索马里))。所以,我感兴趣的是如何在28,000行的数据集中删除这些类型的行。
答案 0 :(得分:2)
dplyr也是一个好方法 - 你只需要&#34;保持&#34;而不是&#34; drop&#34;
library(dplyr)
filter(df, (yearc != lead(yearc, 1) & yearc != lag(yearc, 1)) | wartype == "CIVIL")
答案 1 :(得分:1)
您专注于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 civil
<强> 1。删除观察 如果你想删除不是&#34; civil&#34;在C列中,您可以对数据框进行子集化,以便仅保留那些&#34; civil&#34;:
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。将观察结果标记为缺失 如果你想标记不是&#34; civil&#34;在C列中,您可以通过将其覆盖为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为&#34; inter&#34;时,您的原始Stata代码将寻求子集。或&#34;内部&#34;。但是,您的样本数据的呈现方式,这似乎是一个多余的问题,这就是为什么我的解决方案只考虑列c。但是,如果您希望尽可能地匹配Stata代码,可以通过
执行此操作df <- df[order(df$b, df$c),]
df$duplicate <- duplicated(df$b)
df2 <- df[df$c=="civil" & df$duplicate==FALSE,]
其中
答案 2 :(得分:0)
尝试将|
运算符更改为&
。
以下是一些组成的数据:
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),]
的最后一行也可以正常工作