在R中为箱线图数据构造bodytemp列并分配对应值
我是R及数据可视化领域的纯新手,想要绘制箱线图展示蜥蜴体温与栖息基质的关系。现有数据集如下:
liz. temp sub on 1 23.5 hum y 1 23.1 nat n 2 22.8 hum y 2 22.1 nat n
其中,liz.为蜥蜴编号,temp是基质温度,sub是基质类型,on标记蜥蜴是否栖息在该基质(y表示蜥蜴栖息于此,对应体温为该行的temp值;n表示该蜥蜴附近的其他基质)。
我目前编写了如下代码:
lizandsubtemp<- data.frame('liz'=data$liz., 'subtemp'=data$temp, 'subpos'=data$sub, 'bodytemp'= ) lizandsubtemp
请问如何构造bodytemp列,使其取on列为y对应的temp值?另外,我不太会使用dput()函数,能否提供相关使用技巧?
我尝试了以下代码:
lizandsubtemp <- data.frame('liz'=data$liz., 'subtemp'=data$temp, 'subpos'=data$sub, 'bodytemp'=binary_var=data$on) lizandsubtemp
出现了错误:
Error: unexpected '=' in "lizandsubtemp<- data.frame('liz'=data$liz.,
'subtemp'=data$temp, 'subpos'=data$sub, 'bodytemp'=binary_var="
一、构造bodytemp列的方法
你需要的是当on为y时,bodytemp取对应行的temp值,on为n时可以设为NA(表示非栖息基质无对应体温),两种简单实现方式:
方法1:基础R条件判断
直接在data.frame()里用ifelse函数完成逻辑判断:
# 假设原始数据集名为data lizandsubtemp <- data.frame( liz = data$liz., subtemp = data$temp, subpos = data$sub, bodytemp = ifelse(data$on == "y", data$temp, NA) )
执行后,bodytemp列中on为y的行将显示对应temp值,n的行则为NA。
方法2:用dplyr包(更易读,适合后续数据处理)
如果后续要做更多数据清洗操作,推荐用dplyr包,代码逻辑更直观:
# 首次使用需先安装包 # install.packages("dplyr") library(dplyr) lizandsubtemp <- data %>% mutate( liz = liz., subtemp = temp, subpos = sub, bodytemp = ifelse(on == "y", temp, NA) ) %>% select(liz, subtemp, subpos, bodytemp) # 筛选需要保留的列
二、你代码报错的原因
你写的'bodytemp'=binary_var=data$on是语法错误,在data.frame()中,每一列的定义格式是列名=值,不能嵌套binary_var=这种多余赋值,就算改成bodytemp = data$on也只是把on列的值赋给bodytemp,不符合你要的体温逻辑,还是得用上面的条件判断方法。
三、dput()函数使用技巧
dput()用来导出R对象(比如数据集)的可复制代码,方便他人复现你的数据,常用场景:
- 导出完整数据集:直接传入数据集名称,控制台会输出可复制的代码:
dput(data)
- 导出前N行数据:如果数据集过大,只导出前几行避免输出内容过长:
dput(head(data, 10)) # 导出前10行
- 导出到本地文件:把代码保存到工作目录的文件中:
dput(data, file = "lizard_data.txt")
- 导入
dput导出的数据:把他人提供的dput代码粘贴到控制台运行,就能得到完全一致的数据集,比如你的数据集可以这样导入:
data <- structure(list(liz. = c(1L, 1L, 2L, 2L), temp = c(23.5, 23.1, 22.8, 22.1), sub = c("hum", "nat", "hum", "nat"), on = c("y", "n", "y", "n")), class = "data.frame", row.names = c(NA, -4L))
内容的提问来源于stack exchange,提问作者user24710970

