如果其他人在R里什么也不做

如果其他人在R里什么也不做,r,if-statement,dataframe,R,If Statement,Dataframe,我是一个非常新手的R程序员,我正在尝试将旧的SAS代码转换为R。我需要根据一个条件替换值,如果条件为false,就不要管它们。我已经在谷歌上搜索了这篇文章,并尝试了发布的许多解决方案,但都没有用。我这样做的原因是对事件的第一个实例进行分类(在本例中是医生开处方)。如果他们开处方的第一个月是去年5月,那么他们的起始月(newwriter)是5月。如果是在6月,那么是6月等等。我从今年6月开始向后工作,如果发现更早的处方,我想更新他们的开始月份(newwriter)。如果找不到更早的处方,我想不去管

我是一个非常新手的R程序员,我正在尝试将旧的SAS代码转换为R。我需要根据一个条件替换值,如果条件为false,就不要管它们。我已经在谷歌上搜索了这篇文章,并尝试了发布的许多解决方案,但都没有用。我这样做的原因是对事件的第一个实例进行分类(在本例中是医生开处方)。如果他们开处方的第一个月是去年5月,那么他们的起始月(newwriter)是5月。如果是在6月,那么是6月等等。我从今年6月开始向后工作,如果发现更早的处方,我想更新他们的开始月份(newwriter)。如果找不到更早的处方,我想不去管这个号码。这是我正在使用的代码:

newwriters$newwriter=ifelse(newwriters$MTRx_06_30_2017>0,18,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_05_31_2017>0,17,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_04_30_2017>0,16,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_03_31_2017>0,15,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_02_28_2017>0,14,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_01_31_2017>0,13,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_12_31_2016>0,12,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_11_30_2016>0,11,NULL)
newwriters$newwriter=ifelse(newwriters$MTRx_10_31_2016>0,10,NULL)
问题是,如果在该月内找不到处方,它会不断将较高的值更改为0。我希望它不要去管这些值。我也尝试了以下所有方法,但没有成功:

newwriters$newwriter=ifelse(newwriters$MTRx_06_30_2017>0,18,newwriters$newwriter)
newwriters$newwriter=ifelse(newwriters$MTRx_06_30_2017>0,18,newwriters[,16])
newwriters$newwriter=ifelse(newwriters$MTRx_06_30_2017>0,18,)

正如我提到的,我对编写R代码还不熟悉。我确信有更好/更快/更有效的方法来做这件事,但我不确定还有什么可以尝试的。提前感谢您的帮助

如果您希望有条件地更改列(或向量),并且在不满足条件的地方保持条目不变,您也可以不使用
ifelse

考虑以下两个向量:

a = c(1,2,3,4,5)
b = c(1,1,1,1,1)
现在,假设我们想用
2
替换
b
中的值,如果
a
中的值大于
3
。这里有两种方法可以实现您的目标:

b[a>2] = 2
b = ifelse(a>3,2,b)
它们都将导致
b
成为
12
。但是,现在让我们将
a
中的一个值替换为
NA
,比方说

a = c(1,2,NA,4,5)
现在,比较以下两个片段的结果:

b = c(1,1,1,1,1)
b[a>2] = 2
# 1 1 1 2 2

直观的原因是
NA>3
返回的不是
TRUE
FALSE
,而是
NA
,因此
ifelse
不知道返回两个字段中的哪一个。当执行
b[a>2]
时,我们只替换
a>2
TRUE
的值,并且由于
NA
不是
TRUE
,因此第三个条目的值不会被更改


那么在你的具体情况下,

writers$newwriter=ifelse(newwriters$MTRx_06_30_2017>0,18,newwriters$newwriter)
可能无法按预期工作,因为这些列中存在NULL或NA值。如果要使用
ifelse
,可以执行以下操作:

writers$newwriter=ifelse(newwriters$MTRx_06_30_2017>0 & !is.na(newwriters$MTRx_06_30_2017),18,newwriters$newwriter)
<>但是你也可以考虑做< /P>
writers$newwriter[newwriters$MTRx_06_30_2017>0] = 18

希望这有帮助

更好的方法是使用包dplyr中的
if_else
。它对
NA
s进行了显式处理,这使得它更加健壮,而且速度也稍快

快速示例:

> library(tidyverse)
> iris2 = iris %>% as_data_frame()
> 
> #add some NA's
> iris2$Sepal.Length[c(1, 5, 8)] = NA
> 
> #print
> iris2
# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1        NA           3.50         1.40       0.200 setosa 
 2         4.90        3.00         1.40       0.200 setosa 
 3         4.70        3.20         1.30       0.200 setosa 
 4         4.60        3.10         1.50       0.200 setosa 
 5        NA           3.60         1.40       0.200 setosa 
 6         5.40        3.90         1.70       0.400 setosa 
 7         4.60        3.40         1.40       0.300 setosa 
 8        NA           3.40         1.50       0.200 setosa 
 9         4.40        2.90         1.40       0.200 setosa 
10         4.90        3.10         1.50       0.100 setosa 
# ... with 140 more rows
> 
> #conditionally change
> iris2$new_var = if_else(iris2$Sepal.Length > 5, true = 100, false = 0, missing = -100)
> 
> iris2$new_var
  [1] -100    0    0    0 -100  100    0 -100    0    0  100    0    0    0  100  100  100  100  100  100  100  100    0  100    0    0    0
 [28]  100  100    0    0  100  100  100    0    0  100    0    0  100    0    0    0    0  100    0  100    0  100    0  100  100  100  100
 [55]  100  100  100    0  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
 [82]  100  100  100  100  100  100  100  100  100  100  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100    0  100
[109]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
[136]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
>库(tidyverse)
>iris2=iris%>%as_数据_帧()
> 
>#添加一些NA
>iris2$萼片长度[c(1,5,8)]=NA
> 
>#打印
>虹膜2
#一个tibble:150x5
萼片。长萼片。宽花瓣。长花瓣。宽种
1 NA 3.50 1.40 0.200刚毛
2 4.90 3.00 1.40 0.200刚毛
3 4.70 3.20 1.30 0.200刚毛
4.60 3.10 1.50 0.200刚毛
5 NA 3.60 1.40 0.200刚毛
6 5.40 3.90 1.70 0.400刚毛
7 4.60 3.40 1.40 0.300刚毛
8 NA 3.40 1.50 0.200刚毛
9 4.40 2.90 1.40 0.200刚毛
10 4.90 3.10 1.50 0.100刚毛
# ... 还有140多行
> 
>#有条件地改变
>iris2$new\u var=if\u else(iris2$Sepal.Length>5,true=100,false=0,missing=-100)
> 
>iris2$new_var
[1] -100    0    0    0 -100  100    0 -100    0    0  100    0    0    0  100  100  100  100  100  100  100  100    0  100    0    0    0
[28]  100  100    0    0  100  100  100    0    0  100    0    0  100    0    0    0    0  100    0  100    0  100    0  100  100  100  100
[55]  100  100  100    0  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
[82]  100  100  100  100  100  100  100  100  100  100  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100    0  100
[109]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
[136]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100

因此,我们创建了一个新变量,其中5以上的值变为100,5以下的值变为0,
NA
变为-100。

为什么不使用
if(){}
而不是
ifelse()
?因为如果使用if(){},我会得到向量错误。“如果(新作者$MTRx\u 06\u 30\u 2017>0){:条件的长度大于1,只有第一个元素会被使用,
apply
对您有帮助。如果您重复基本相同的行,那么您的代码通常是次优的。您应该完全重写这一行,而不是按照SAS的字面意思。您可能还应该重塑数据。R与SAS完全不同。PS:Y您肯定不想在此处指定NULL。我不熟悉
apply
,但我会做一些研究,谢谢!我在列中有NA值。我添加了您的解决方案,它按照我的预期工作。您能告诉我为什么它工作,以便我更好地理解未来吗?当然。您将NA值与检查它们是否大于某个值。在R:Na>1中尝试如下。您将看到它不返回false,但它返回NA。因此,您的代码不知道该怎么做。希望这有帮助。请您考虑接受我的回答吗?谢谢!谢谢。NA(缺少)值。注意
if_else()
是dplyr包的一部分。
> library(tidyverse)
> iris2 = iris %>% as_data_frame()
> 
> #add some NA's
> iris2$Sepal.Length[c(1, 5, 8)] = NA
> 
> #print
> iris2
# A tibble: 150 x 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1        NA           3.50         1.40       0.200 setosa 
 2         4.90        3.00         1.40       0.200 setosa 
 3         4.70        3.20         1.30       0.200 setosa 
 4         4.60        3.10         1.50       0.200 setosa 
 5        NA           3.60         1.40       0.200 setosa 
 6         5.40        3.90         1.70       0.400 setosa 
 7         4.60        3.40         1.40       0.300 setosa 
 8        NA           3.40         1.50       0.200 setosa 
 9         4.40        2.90         1.40       0.200 setosa 
10         4.90        3.10         1.50       0.100 setosa 
# ... with 140 more rows
> 
> #conditionally change
> iris2$new_var = if_else(iris2$Sepal.Length > 5, true = 100, false = 0, missing = -100)
> 
> iris2$new_var
  [1] -100    0    0    0 -100  100    0 -100    0    0  100    0    0    0  100  100  100  100  100  100  100  100    0  100    0    0    0
 [28]  100  100    0    0  100  100  100    0    0  100    0    0  100    0    0    0    0  100    0  100    0  100    0  100  100  100  100
 [55]  100  100  100    0  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
 [82]  100  100  100  100  100  100  100  100  100  100  100  100    0  100  100  100  100  100  100  100  100  100  100  100  100    0  100
[109]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100
[136]  100  100  100  100  100  100  100  100  100  100  100  100  100  100  100