Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在TIBLE中从右向左列移动数据_R_Dplyr_Stringr - Fatal编程技术网

R 在TIBLE中从右向左列移动数据

R 在TIBLE中从右向左列移动数据,r,dplyr,stringr,R,Dplyr,Stringr,我有一个关于诊断信息的tibble: data <- tibble( id = c(1:10), diagnosis_1 = c("F32", "F431", "R58", "S32", "F11", NA, NA, "Y67", "F32", "Z032"), diagnosis_2 = c(NA, NA, NA, NA, NA, NA, "G35", NA, NA, NA), diagnosis_3 = c("F40", NA, "R67", "F431", NA, "

我有一个关于诊断信息的tibble:

data <- tibble(
  id = c(1:10),
  diagnosis_1 = c("F32", "F431", "R58", "S32", "F11", NA, NA, "Y67", "F32", "Z032"),
  diagnosis_2 = c(NA, NA, NA, NA, NA, NA, "G35", NA, NA, NA),
  diagnosis_3 = c("F40", NA, "R67", "F431", NA, "F60", "S58", "R68", "F11", NA),
  diagnosis_4 = c(NA, NA, "F65", NA, "F19", NA, NA, "F32", NA, NA)
)
非常感谢所有建议

编辑:添加预期输出:


您可以从
dplyr
使用
Reduce
coalesce
,即

df$diagnosis_1 <- Reduce(dplyr::coalesce, df[-1])

#id diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4
#   <int> <chr>       <chr>       <chr>       <chr>      
# 1     1 F32         <NA>        F40         <NA>       
# 2     2 F431        <NA>        <NA>        <NA>       
# 3     3 F65         <NA>        <NA>        F65        
# 4     4 F431        <NA>        F431        <NA>       
# 5     5 F11         <NA>        <NA>        F19        
# 6     6 F60         <NA>        F60         <NA>       
# 7     7 G35         G35         <NA>        <NA>       
# 8     8 F32         <NA>        <NA>        F32        
# 9     9 F32         <NA>        F11         <NA>       
#10    10 Z032        <NA>        <NA>        <NA> 

df$diagnosis\u 1我们首先
将以“R”、“S”或“Y”开头的值替换为
NA
,然后将非NA值左移

data[-1] <- lapply(data[-1], function(x) replace(x, grepl("^[R|S|Y]", x), NA))  
data[] <- t(apply(data, 1, function(x) `length<-`(na.omit(x), length(x))))

data
# A tibble: 10 x 5
#     id diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4
#   <chr> <chr>       <chr>       <chr>       <chr>      
# 1 " 1"  F32         F40         NA          NA         
# 2 " 2"  F431        NA          NA          NA         
# 3 " 3"  F65         NA          NA          NA         
# 4 " 4"  F431        NA          NA          NA         
# 5 " 5"  F11         F19         NA          NA         
# 6 " 6"  F60         NA          NA          NA         
# 7 " 7"  G35         NA          NA          NA         
# 8 " 8"  F32         NA          NA          NA         
# 9 " 9"  F32         F11         NA          NA         
#10  10   Z032        NA          NA          NA    

data[-1]您可以尝试使用
tidyverse

library(tidyverse)
data %>% 
  mutate_at(vars(starts_with("diagnosis")), funs(ifelse(str_sub(., 1, 1) %in% c("R", "S", "Y"), NA, .))) %>% 
  gather(k,v, -id) %>% 
  group_by(id) %>% 
  arrange(id) %>% 
  mutate(v=ifelse(k == "diagnosis_1", v[!is.na(v)][1], v)) %>% 
  spread(k, v)
# A tibble: 10 x 5
# Groups:   id [10]
      id diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4
   <int> <chr>       <chr>       <chr>       <chr>      
 1     1 F32         NA          F40         NA         
 2     2 F431        NA          NA          NA         
 3     3 F65         NA          NA          F65        
 4     4 F431        NA          F431        NA         
 5     5 F11         NA          NA          F19        
 6     6 F60         NA          F60         NA         
 7     7 G35         G35         NA          NA         
 8     8 F32         NA          NA          F32        
 9     9 F32         NA          F11         NA         
10    10 Z032        NA          NA          NA 
库(tidyverse)
数据%>%
在(VAR(以“诊断”开头)、funs(ifelse(str_sub(,1,1)%in%c(“R”、“S”、“Y”)、NA中)发生突变%>%
聚集(k,v,-id)%>%
分组依据(id)%>%
排列(id)%>%
变异(v=ifelse(k==“诊断1”,v[!is.na(v)][1],v))%>%
扩散(k,v)
#一个tibble:10x5
#组别:id[10]
id诊断\u 1诊断\u 2诊断\u 3诊断\u 4
1 1 F32 NA F40 NA
2 2 F431 NA NA NA
3 3 F65 NA NA F65
4 4 F431 NA F431 NA
5 5 F11 NA NA F19
6 F60 NA F60 NA
7 7 G35 G35 NA NA
8 8 F32 NA F32
9 9 F32 NA F11 NA
10 10 Z032 NA NA NA
由于不清楚OP想要什么(见下面的讨论),您也可以尝试

data %>% 
  mutate_at(vars(starts_with("diagnosis")), funs(ifelse(str_sub(., 1, 1) %in% c("R", "S", "Y"), NA, .))) %>% 
  gather(k,v, -id) %>% 
  group_by(id) %>% 
  arrange(id) %>% 
  mutate(v=c(v[!is.na(v)], rep(NA, length(v) - length(v[!is.na(v)])))) %>% 
  spread(k, v)
# A tibble: 10 x 5
# Groups:   id [10]
      id diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4
   <int> <chr>       <chr>       <chr>       <chr>      
 1     1 F32         F40         NA          NA         
 2     2 F431        NA          NA          NA         
 3     3 F65         NA          NA          NA         
 4     4 F431        NA          NA          NA         
 5     5 F11         F19         NA          NA         
 6     6 F60         NA          NA          NA         
 7     7 G35         NA          NA          NA         
 8     8 F32         NA          NA          NA         
 9     9 F32         F11         NA          NA         
10    10 Z032        NA          NA          NA
数据%>%
在(VAR(以“诊断”开头)、funs(ifelse(str_sub(,1,1)%in%c(“R”、“S”、“Y”)、NA中)发生突变%>%
聚集(k,v,-id)%>%
分组依据(id)%>%
排列(id)%>%
变异(v=c(v[!is.na(v)],代表(na,长度(v)-长度(v[!is.na(v)])))%>%
扩散(k,v)
#一个tibble:10x5
#组别:id[10]
id诊断\u 1诊断\u 2诊断\u 3诊断\u 4
1 1 F32 F40 NA NA
2 2 F431 NA NA NA
3 F65 NA NA NA
4 F431 NA NA NA
5 5 F11 F19 NA NA
6 F60 NA NA NA
7 7 G35 NA NA
8 8 F32 NA NA
9 9 F32 F11不适用
10 10 Z032 NA NA NA
使用dplyr和tidyr。从宽到长重塑,排除
“^RSY”
NA
诊断,从长到宽重塑

library(dplyr)
library(tidyr)

gather(data, key = "k", value = "v", -id) %>% 
  filter(!(grepl("^[R|S|Y]", v) | is.na(v))) %>% 
  group_by(id) %>% 
  mutate(diagN = paste0("diagnosis_", row_number())) %>% 
  select(-k) %>% 
  spread(key = "diagN", value = "v") %>% 
  ungroup()

# # A tibble: 10 x 3
#       id diagnosis_1 diagnosis_2
#    <int> <chr>       <chr>      
#  1     1 F32         F40        
#  2     2 F431        NA         
#  3     3 F65         NA         
#  4     4 F431        NA         
#  5     5 F11         F19        
#  6     6 F60         NA         
#  7     7 G35         NA         
#  8     8 F32         NA         
#  9     9 F32         F11        
# 10    10 Z032        NA  
库(dplyr)
图书馆(tidyr)
收集(数据,key=“k”,value=“v”,-id)%>%
过滤器(!(grepl(“^[R|S|Y]”,v)|是.na(v)))%>%
分组依据(id)%>%
突变(diagN=paste0(“诊断”,行号())%>%
选择(-k)%>%
价差(key=“diagN”,value=“v”)%>%
解组()
##tibble:10 x 3
#id诊断\u 1诊断\u 2
#                  
#1 1 F32 F40
#2 F431 NA
#3 F65 NA
#4 F431 NA
#5楼11楼19层
#6 F60 NA
#7 G35 NA
#8 F32 NA
#9楼22层11层
#10 10 Z032 NA

@RonakShah他应该包括可复制的输出。只要我们不知道他到底想要什么@RonakShah IMO他只想更新
diagnostics_1
,其他列保持原样@RonakShah也包括这一解决方案。
data %>% 
  mutate_at(vars(starts_with("diagnosis")), funs(ifelse(str_sub(., 1, 1) %in% c("R", "S", "Y"), NA, .))) %>% 
  gather(k,v, -id) %>% 
  group_by(id) %>% 
  arrange(id) %>% 
  mutate(v=c(v[!is.na(v)], rep(NA, length(v) - length(v[!is.na(v)])))) %>% 
  spread(k, v)
# A tibble: 10 x 5
# Groups:   id [10]
      id diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4
   <int> <chr>       <chr>       <chr>       <chr>      
 1     1 F32         F40         NA          NA         
 2     2 F431        NA          NA          NA         
 3     3 F65         NA          NA          NA         
 4     4 F431        NA          NA          NA         
 5     5 F11         F19         NA          NA         
 6     6 F60         NA          NA          NA         
 7     7 G35         NA          NA          NA         
 8     8 F32         NA          NA          NA         
 9     9 F32         F11         NA          NA         
10    10 Z032        NA          NA          NA
library(dplyr)
library(tidyr)

gather(data, key = "k", value = "v", -id) %>% 
  filter(!(grepl("^[R|S|Y]", v) | is.na(v))) %>% 
  group_by(id) %>% 
  mutate(diagN = paste0("diagnosis_", row_number())) %>% 
  select(-k) %>% 
  spread(key = "diagN", value = "v") %>% 
  ungroup()

# # A tibble: 10 x 3
#       id diagnosis_1 diagnosis_2
#    <int> <chr>       <chr>      
#  1     1 F32         F40        
#  2     2 F431        NA         
#  3     3 F65         NA         
#  4     4 F431        NA         
#  5     5 F11         F19        
#  6     6 F60         NA         
#  7     7 G35         NA         
#  8     8 F32         NA         
#  9     9 F32         F11        
# 10    10 Z032        NA