R 将NA替换为基于行的值';s状态
一个五列表格(“id”、“othermood_v”、“rass_v”、“gcs_v”和“cam_v”),大约有52000行。最后一列(“cam_v”)中有三个值:0,1,2作为类标签。“cam_v”列现在的值为1、2和NA。我想在其他三列“othermood_v”、“rass_v”和“gcs_v”中用0或1替换NA值。因此,如果同一行中这三列中的任何一列具有类似于1的值,则cam_v将标记为1,否则为0。我试图循环遍历数据,条件如下R 将NA替换为基于行的值';s状态,r,R,一个五列表格(“id”、“othermood_v”、“rass_v”、“gcs_v”和“cam_v”),大约有52000行。最后一列(“cam_v”)中有三个值:0,1,2作为类标签。“cam_v”列现在的值为1、2和NA。我想在其他三列“othermood_v”、“rass_v”和“gcs_v”中用0或1替换NA值。因此,如果同一行中这三列中的任何一列具有类似于1的值,则cam_v将标记为1,否则为0。我试图循环遍历数据,条件如下 if df$othermood_v>0|df$rass
if df$othermood_v>0|df$rass_v>0|df$gcs_v >0, then df$cam_v=1 else
0, rm NA = True
或
但我不知道如何让它发挥作用。有什么建议吗?顺便说一句,id现在是唯一的。谢谢
id othermood_v rass_v gcs_v cam_v
100078 0 0 0 NA
100079 0 0 0 NA
100081 0 0 0 NA
100085 1 1 0 NA
100087 1 1 0 NA
100088 1 0 0 NA
100091 1 1 1 2
100094 0 1 0 NA
100095 1 0 0 NA
100096 0 0 0 NA
100098 1 1 1 2
100099 0 1 0 NA
100102 1 0 0 NA
100103 1 0 0 NA
100104 1 1 0 2
100106 0 0 0 NA
100108 1 0 0 NA
100109 1 0 0 NA
100112 1 0 0 NA
100113 1 1 1 1
100114 1 0 0 NA
100116 1 0 0 NA
100117 1 0 0 NA
100118 0 1 0 NA
我们创建一个逻辑向量,然后使用另一个用
行和创建的条件进行替换
i1 <- is.na(df1$cam_v) # logical index of NA elements in 'cam_v'
# assign the values 0 or 1 based on the occurrence of 1 in
# either one of the columns from 2 to 4
df1$cam_v[i1] <- +(rowSums(df1[i1, 2:4] > 0) > 0)
i10)
数据
df1使用dplyr的解决方案
library(dplyr)
df_clean <- df %>%
mutate(cam_v = ifelse(!is.na(cam_v), cam_v,
ifelse((othermood_v + rass_v + gcs_v) > 0, 1, 0)))
> df_clean
id othermood_v rass_v gcs_v cam_v
1 100078 0 0 0 0
2 100079 0 0 0 0
3 100081 0 0 0 0
4 100085 1 1 0 1
5 100087 1 1 0 1
6 100088 1 0 0 1
7 100091 1 1 1 2
8 100094 0 1 0 1
9 100095 1 0 0 1
10 100096 0 0 0 0
11 100098 1 1 1 2
12 100099 0 1 0 1
13 100102 1 0 0 1
14 100103 1 0 0 1
15 100104 1 1 0 2
16 100106 0 0 0 0
17 100108 1 0 0 1
18 100109 1 0 0 1
19 100112 1 0 0 1
20 100113 1 1 1 1
21 100114 1 0 0 1
22 100116 1 0 0 1
23 100117 1 0 0 1
24 100118 0 1 0 1
你对你的方法很熟悉,你只需要改变一下你的方法。
以下各项应起作用:
df$cam_v<-ifelse((df$othermood_v>0|df$rass_v>0|df$gcs_v >0), 1,0)
df$cam_v0 | df$rass_v>0 | df$gcs_v>0),1,0)
可能重复感谢您提供的超快速智能解决方案!我得到的唯一错误是第一行类标签。第一行标签显示为整数(9)。不知道为什么。但我可以手动更正它。:-。谢谢@柳叶刀对于我来说,第一行显示为0
,因为该行中的所有其他值都是0。我在考虑类似的问题df[rowSums(df[,-4])>0&is.na(df[,4]),4]=1
,df[rowSums(df[,-4])==0&is.na(df[,4]),4]=0
好的,那么我必须运行错误的程序。但是谢谢你的邀请reply@lancet让我粘贴我使用的数据。你能检查一下str(df1)
吗。如果它是不同的type@JBCruber我现在没有权利投票给任何人。但是很高兴得到不同的解决方案。谢谢你的回答。我试过了。被替换的值应仅进入最后一列“cam_v”中的单元格,即其中有NULL。有了你提供的答案,我最明白了。但它替换了cam_v列中的所有值。甚至我以前在那个专栏里也有“1”或“2”的标签。我想你的回答应该加上一个“如果”字!不知道,但我不知道该放在哪里。JFI,我已经解决了我的问题。我只想多学一点。谢谢
library(dplyr)
df_clean <- df %>%
mutate(cam_v = ifelse(!is.na(cam_v), cam_v,
ifelse((othermood_v + rass_v + gcs_v) > 0, 1, 0)))
> df_clean
id othermood_v rass_v gcs_v cam_v
1 100078 0 0 0 0
2 100079 0 0 0 0
3 100081 0 0 0 0
4 100085 1 1 0 1
5 100087 1 1 0 1
6 100088 1 0 0 1
7 100091 1 1 1 2
8 100094 0 1 0 1
9 100095 1 0 0 1
10 100096 0 0 0 0
11 100098 1 1 1 2
12 100099 0 1 0 1
13 100102 1 0 0 1
14 100103 1 0 0 1
15 100104 1 1 0 2
16 100106 0 0 0 0
17 100108 1 0 0 1
18 100109 1 0 0 1
19 100112 1 0 0 1
20 100113 1 1 1 1
21 100114 1 0 0 1
22 100116 1 0 0 1
23 100117 1 0 0 1
24 100118 0 1 0 1
df <- read.table(text =
"id othermood_v rass_v gcs_v cam_v
100078 0 0 0 NA
100079 0 0 0 NA
100081 0 0 0 NA
100085 1 1 0 NA
100087 1 1 0 NA
100088 1 0 0 NA
100091 1 1 1 2
100094 0 1 0 NA
100095 1 0 0 NA
100096 0 0 0 NA
100098 1 1 1 2
100099 0 1 0 NA
100102 1 0 0 NA
100103 1 0 0 NA
100104 1 1 0 2
100106 0 0 0 NA
100108 1 0 0 NA
100109 1 0 0 NA
100112 1 0 0 NA
100113 1 1 1 1
100114 1 0 0 NA
100116 1 0 0 NA
100117 1 0 0 NA
100118 0 1 0 NA", header = TRUE)
df$cam_v<-ifelse((df$othermood_v>0|df$rass_v>0|df$gcs_v >0), 1,0)