R 将NA替换为基于行的值';s状态

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

一个五列表格(“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_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)