将Stata代码翻译成R

时间:2014-11-04 03:45:13

标签: r stata

关于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行的数据集中删除这些类型的行。

3 个答案:

答案 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()命令,但大多数人更喜欢使用括号进行子集化(参见下面的代码)。

在您的原始问题中,您会问如何做两件事:

  1. 如何删除已编码的观察(即行)&#34; inter&#34;或&#34;内部&#34;在C列和
  2. 如何将其标记为缺失
  3. 示例数据

    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,] 
    

    其中

    1. 按年份按时间顺序排序数据,然后按战争
    2. 按字母顺序排序
    3. 创建一个新变量,指定列b是否为重复年份
    4. 对数据框进行子集以删除不需要的案例。

答案 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),]的最后一行也可以正常工作