楼主: dandan_9075
1433 15

R语言求助,根据旧的两个变量的不同组合生成新的变量 [推广有奖]

  • 3关注
  • 2粉丝

硕士生

66%

还不是VIP/贵宾

-

威望
0
论坛币
36 个
通用积分
2.6381
学术水平
1 点
热心指数
4 点
信用等级
1 点
经验
2164 点
帖子
148
精华
0
在线时间
120 小时
注册时间
2012-3-12
最后登录
2024-6-27

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
R语言求助。原有数据是这样的:数据集名称为edu edu.xls (27 KB) ,数据集edu里有id、a、b、c、d、e共6个变量,a和b的值为都为0、1或者缺失(NA)三种情况,a和b如图1所示。要根据a和b不同交叉组合在数据集edu里生成一个新的变量m,两个要求:(一)要求1:
           如果 a=1b=1,则m=9

     如果 a=1且b=0,则m=8;

     如果 a=1且b=NA,则m=7;

      如果 a=0且b=1,则m=6;

     如果 a=0且b=0,则m=5;

     如果 a=0且b=NA,则m=4;

    如果 a=NA且b=1,则m=3;

    如果 a=NA且b=0,则m=2;

   如果 a=NA且b为NA,则m=1。

(二)要求2:如果两个变量a和b任意一个为1,则m为1;如果两个变量a和b都为NA,则m为NA;其余情况m都赋值为0(即a和b都为0,a为0但是b缺失,a缺失但是b为0这三种情况m都赋值为0)。

请教怎么用R实现?
         







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 edu 数据集 R实现

已有 1 人评分经验 论坛币 收起 理由
冰枫冷羽 + 100 + 20 鼓励积极发帖讨论

总评分: 经验 + 100  论坛币 + 20   查看全部评分

沙发
ficonay 发表于 2024-5-15 23:27:12 |只看作者 |坛友微信交流群
用dplyr里的case_when和mutate函数

mutate( m = case_when(
a == 1 & b== 1 ~ 9,
a == 1 & is.na(b) ~ 8,
a == 0 & b = 1 ~ 7,
....
)

使用道具

藤椅
dandan_9075 在职认证  发表于 2024-5-16 15:16:47 |只看作者 |坛友微信交流群
ficonay 发表于 2024-5-15 23:27
用dplyr里的case_when和mutate函数

mutate( m = case_when(
试了一下,报错:
Error in UseMethod("mutate") :
  "mutate"没有适用于"c('double', 'numeric')"目标对象的方法,请问应该怎么解决呢?还有如何实现,新生成的变量还是保存在edu这个数据集,也就是直接在edu数据集里添加一列m?
万分谢谢!!!!

使用道具

板凳
赵安豆 发表于 2024-5-16 21:14:07 |只看作者 |坛友微信交流群
可以使用ifelse语句或者case_when函数来完成这个任务。以下是两种方法的示例:

方法一:使用ifelse语句

```R
edu$m <- ifelse(is.na(edu$a) & is.na(edu$b), NA,
                ifelse((edu$a == 1 | edu$b == 1), 1,
                       ifelse(edu$a == 1 & edu$b == 1, 9,
                              ifelse(edu$a == 1 & edu$b == 0, 8,
                                     ifelse(edu$a == 1 & is.na(edu$b), 7,
                                            ifelse(edu$a == 0 & edu$b == 1, 6,
                                                   ifelse(edu$a == 0 & edu$b == 0, 5,
                                                          ifelse(edu$a == 0 & is.na(edu$b), 4,
                                                                 ifelse(is.na(edu$a) & edu$b == 1, 3,
                                                                        ifelse(is.na(edu$a) & edu$b == 0, 2, 0)))))))))
```

方法二:使用case_when函数(需要dplyr库)

```R
library(dplyr)

edu <- edu %>%
  mutate(m = case_when(
    is.na(a) & is.na(b) ~ NA_real_,
    a == 1 | b == 1 ~ 1,
    a == 1 & b == 1 ~ 9,
    a == 1 & b == 0 ~ 8,
    a == 1 & is.na(b) ~ 7,
    a == 0 & b == 1 ~ 6,
    a == 0 & b == 0 ~ 5,
    a == 0 & is.na(b) ~ 4,
    is.na(a) & b == 1 ~ 3,
    is.na(a) & b == 0 ~ 2,
    TRUE ~ 0
  ))
```

上述代码会根据你提供的要求在edu数据集中创建一个新变量m。你可以选择你喜欢的方法进行操作。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



使用道具

报纸
Killua609 发表于 2024-5-17 10:20:33 |只看作者 |坛友微信交流群
实现是

使用道具

地板
dandan_9075 在职认证  发表于 2024-5-17 12:07:22 |只看作者 |坛友微信交流群
赵安豆 发表于 2024-5-16 21:14
可以使用ifelse语句或者case_when函数来完成这个任务。以下是两种方法的示例:

方法一:使用ifelse语句
感谢!
按照上述方法之一试了一下

edu <- edu %>%
  mutate(m = case_when(
    a == 1 & b == 1 ~ 9,
    a == 1 & b == 0 ~ 8,
    a == 1 & is.na(b) ~ 7,
    a == 0 & b == 1 ~ 6,
    a == 0 & b == 0 ~ 5,
    a == 0 & is.na(b) ~ 4,
    is.na(a) & b == 1 ~ 3,
    is.na(a) & b == 0 ~ 2,
    is.na(a) & is.na(b) ~1))

t<-table(edu$m,useNA="ifany")
t
关于m的描述如下:
5    6    8    9 <NA>
1    2    2    1   22

但是不正确,比如edu里原来有4行a和b都缺失,新产生的变量m=1应该有4行,但是没有m=1的,请问怎么解决呢?

使用道具

7
cheetahfly 在职认证  发表于 2024-5-17 13:17:55 |只看作者 |坛友微信交流群
dandan_9075 发表于 2024-5-17 12:07
感谢!
按照上述方法之一试了一下
把is.na的判断都提前。
  1. edu <- edu %>%
  2.   mutate(m = case_when(
  3.     is.na(a) & is.na(b) ~1,
  4.     is.na(a) & b == 1 ~ 3,
  5.     is.na(a) & b == 0 ~ 2,
  6.     a == 1 & is.na(b) ~ 7,
  7.     a == 1 & b == 1 ~ 9,
  8.     a == 1 & b == 0 ~ 8,
  9.     a == 0 & is.na(b) ~ 4,
  10.     a == 0 & b == 1 ~ 6,
  11.     a == 0 & b == 0 ~ 5
  12. ))
复制代码

使用道具

8
dandan_9075 在职认证  发表于 2024-5-17 16:32:10 |只看作者 |坛友微信交流群
cheetahfly 发表于 2024-5-17 13:17
把is.na的判断都提前。
多谢,但是
试了以上代码,m仍然是
   5    6    8    9 <NA>
   1    2    2    1   22 还是不正确

使用道具

9
cheetahfly 在职认证  发表于 2024-5-19 11:17:46 |只看作者 |坛友微信交流群
我测试过,关于t的描述是这样的:
1  2  3  4  5  6  7  8  9
4 12  3  1  1  2  2  2  1

问题可能出在其他地方,你执行一下dput(edu),然后将得到的内容复制粘贴在帖子里。

使用道具

10
dandan_9075 在职认证  发表于 2024-6-3 20:24:00 |只看作者 |坛友微信交流群
cheetahfly 发表于 2024-5-19 11:17
我测试过,关于t的描述是这样的:
1  2  3  4  5  6  7  8  9
4 12  3  1  1  2  2  2  1
structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28), a = c("1", "0", "1", "0", "NA", "NA", "1", "0", "NA", "0", "NA", "NA", "NA", "1", "NA", "1", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"), b = c("0", "1", "1", "0", "0", "1", "NA", "NA", "NA", "1", "1", "0", "NA", "0", "NA", "NA", "0", "0", "NA", "0", "0", "1", "0", "0", "0", "0", "0", "0"), c = c("2", "2", "2", "2", "1", "2", "2", "1", "1", "2", "NA", "2", "NA", "2", "1", "2", "2", "2", "2", "1", "2", "2", "2", "2", "2", "NA", "2", NA), d = c("2", "2", "2", "1", "2", "1", "2", "2", "2", "2", "NA", "2", "2", "2", "2", "2", "1", "2", "2", "2", "2", "2", "2", "2", "NA", "2", "NA", "2"), e = c("2", "2", "2", "2", "2", "2", "2", "2", "1", "2", "NA", "2", "NA", "2", "2", "2", "2", "2", "2", "1", "2", "1", "2", "2", "2", "2", "1", "2")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -28L))
执行dput()后是这样的

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-7-27 15:10