如何根据 R 中数据帧中另一个值的属性更改单个值?

时间:2021-02-27 15:38:10

标签: r

我试图连续三年改变一个国家的虚拟变量的值。 我尝试执行以下操作 尝试 1;

d[14696, "abort"] = 1

尝试 2:

d$abort <- ifelse(d$drap == 7.826785, 1, d$abort)

d$abort <- ifelse(d$drap == 8.263874, 1, d$abort)

d$abort <- ifelse(d$drap == 12.060453, 1, d$abort)

尝试 3:

d[14698, 6] = 1

尝试 4:

d$abort[14698]  <-  1

*数字 14698 是行号

它们都没有给出任何错误,这让我认为它们可以工作。但是,数据集中没有任何变化。有人可以帮忙吗?

这是乌拉圭数据框的样子,需要在变量 abort 上编辑 2016-2019 年:

<头>
国家 失业 贫穷 GDPpc 中止 悬垂
2012 乌拉圭 8.8379 0.2 12463 o 6.425273
2013 乌拉圭 8.3742 0.2 10849 1 5.426374
2014 乌拉圭 8.1894 0.2 12938 1 6.738383
2015 乌拉圭 8.2349 0.3 11823 1 7.377327
2016 乌拉圭 9.2369 0.3 10828 o 7.826785
2017 乌拉圭 9.6273 0.4 10748 o 8.263874
2018 乌拉圭 8.2374 0.3 11038 o 12.060453

3 个答案:

答案 0 :(得分:1)

下面是一个 tidyverse 选项,它基于 drap 是 double 类型并且 x. 实际上是 NA 的假设。

library(dplyr)

mutate(df, Abort = if_else(!is.na(drap), 1, Abort))

## A tibble: 7 x 4
#    Year Country Abort  drap
#    <dbl>  <chr> <dbl> <dbl>
# 1  2012 Uruguay     0 NA   
# 2  2013 Uruguay     1 NA   
# 3  2014 Uruguay     1 NA   
# 4  2015 Uruguay     1 NA   
# 5  2016 Uruguay     1  7.83
# 6  2017 Uruguay     1  8.26
# 7  2018 Uruguay     1 12.1 

数据

df <- structure(list(Year = c(2012, 2013, 2014, 2015, 2016, 2017, 2018
), Country = c("Uruguay", "Uruguay", "Uruguay", "Uruguay", "Uruguay", 
"Uruguay", "Uruguay"), Abort = c(0, 1, 1, 1, 0, 0, 0), drap = c(NA, 
NA, NA, NA, 7.826785, 8.263874, 12.060453)), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

答案 1 :(得分:0)

添加到 rjen 的答案(同时也使用他/她的数据框 df )我建议您可以使用 dplyr::case_when,这样

library(dplyr)


df %>% mutate(Abort = 
                case_when(drap %in% c(7.826785, 8.263874, 12.060453) ~ 1  ## if true
                          ,TRUE ~ Abort) ## if false condition
)

在这里,如果 drap 取某个值(类似于您的第二种方法)Abort 变为 1。否则 Abort 保持不变。它可能比常规 ifelse 条件更有用,因为您可以将更多条件连接在一起。您还可以添加类似

 case_when(drap %in% c(7.826785, 8.263874, 12.060453) & Year == 2013 ~ 1

答案 2 :(得分:0)

我在教授的帮助下发现我必须以不同的方式加载数据集:

d <- d[,c("year", "cname", "wdi_unempilo", "wdi_povgap190", "mad_gdppc", "cai_request", "wdi_homicides")]

之后我必须为每年创建一个新变量,然后使用它来重新编码导致问题的原始变量,然后删除创建的变量:

创建新变量

d$abort_2016 <- ifelse(d$Country=="Uruguay" & d$Year==2016,  1, d$abort)

d$abort_2017 <- ifelse(d$Country=="Uruguay" & d$Year==2017,  1, d$abort)

d$abort_2018 <- ifelse(d$Country=="Uruguay" & d$Year==2018,  1, d$abort)

使用创建的变量重新编码

d$abort <- ifelse(d$abort_2016 == 1, 1, d$abort)

d$abort <- ifelse(d$abort_2017 == 1, 1, d$abort)

d$abort <- ifelse(d$abort_2018 == 1, 1, d$abort)

删除创建的变量的子集

d <-  subset(d, select = -c(abort_2016,abort_2016) )

d <-  subset(d, select = -c(abort_2017,abort_2017) )

d <-  subset(d, select = -c(abort_2018,abort_2018) )

这解决了我的问题