首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Stata代码转换为R

将Stata代码转换为R
EN

Stack Overflow用户
提问于 2014-11-04 11:45:13
回答 3查看 325关注 0票数 1

当谈到R中的时间序列数据分析时,一般新手。我在为我正在做的复制项目将一些Stata代码转换为R代码时遇到了麻烦。

Stata代码和Stata代码(来自原始分析)的目的如下:

代码语言:javascript
复制
#### Delete extra yearc observations with different wartypes #####

drop if yearc==yearc[_n+1] & wartype!="CIVIL"
drop if yearc==yearc[_n-1] & wartype!="CIVIL"

所以,翻译过来,我保留了国家正在发生内战的行,并删除了在同一年中发生了州际战争的行。

我已经命名了数据对象(即数据集)

代码语言:javascript
复制
mywar

在R.

我假设我以某种方式执行了一个条件ifelse语句,或者类似的语句,例如:

代码语言:javascript
复制
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:举个例子

代码语言:javascript
复制
> 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行的数据集中删除这些类型的行。

EN

回答 3

Stack Overflow用户

发布于 2015-06-05 08:01:03

dplyr也是一个好方法--你只需要“保留”而不是“丢弃”。

代码语言:javascript
复制
library(dplyr)
filter(df, (yearc != lead(yearc, 1) & yearc != lag(yearc, 1)) | wartype == "CIVIL")
票数 3
EN

Stack Overflow用户

发布于 2015-02-04 01:25:45

您关注的是Stata的if限定符,但听起来您只是想对数据帧进行子集设置--因此您在Stata中使用了drop命令。我也在R之前学习了Stata,并感到困惑,因为我非常依赖Stata中的if限定符,并立即在R中使用ifelse。但是,后来我意识到R中更相关的技术是围绕子集的。有一个subset()命令,但大多数人更喜欢使用括号设置子集(参见下面的代码)。

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

  1. 如何删除在C列上编码为"inter“或"intra”的观测值(即行),以及
  2. 如何将它们标记为缺少

示例数据

代码语言:javascript
复制
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.删除观测值如果要删除列C中不是“民事”的观测值,则可以将数据框子集设置为仅保留那些“民事”的案例:

代码语言:javascript
复制
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的子集,但您也可以完全覆盖原始数据框:

代码语言:javascript
复制
df <- df[df$c=="civil",] 

或者,你可以生成一个新的,然后删除旧的,如果你不喜欢你的工作区杂乱的大量数据框:

代码语言:javascript
复制
df2 <- df[df$c=="civil",]
rm(df)

2.将观测值标记为丢失的如果您想在C列中标记不是"civil“的观测值,可以通过将它们覆盖为NA来实现:

代码语言:javascript
复制
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。

代码语言:javascript
复制
df <- df[order(df$b, df$c),]
df$duplicate <- duplicated(df$b)
df2 <- df[df$c=="civil" & df$duplicate==FALSE,] 

哪一个

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

Stack Overflow用户

发布于 2014-11-04 12:10:22

尝试将您的|操作符更改为&。以下是一些虚构的数据:

代码语言:javascript
复制
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),]的最后一行应该也可以正常工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26727381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档