Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 在数据库的其余部分合并一列数据_R - Fatal编程技术网

R 在数据库的其余部分合并一列数据

R 在数据库的其余部分合并一列数据,r,R,我有一个像这样的数据框 ID Math Chem HoursAvailable 1 Math NA 3:00-4:00 2 NA Chem 4:00-5:00 3 Math Chem 12:00-2:00 ID Math Chem HoursAvailable 1 3:00-4:00 NA 3:00-4:00 2 NA

我有一个像这样的数据框

ID     Math    Chem   HoursAvailable
1      Math    NA      3:00-4:00
2      NA      Chem    4:00-5:00
3      Math    Chem    12:00-2:00
ID     Math        Chem         HoursAvailable
1      3:00-4:00   NA           3:00-4:00
2      NA          4:00-5:00    4:00-5:00
3      12:00-2:00  12:00-2:00   12:00-2:00
我正在尝试将可用的小时数合并到行中,所以看起来像这样

ID     Math    Chem   HoursAvailable
1      Math    NA      3:00-4:00
2      NA      Chem    4:00-5:00
3      Math    Chem    12:00-2:00
ID     Math        Chem         HoursAvailable
1      3:00-4:00   NA           3:00-4:00
2      NA          4:00-5:00    4:00-5:00
3      12:00-2:00  12:00-2:00   12:00-2:00
我无法在不覆盖所有NA值的情况下合并数据。我还尝试将Hoursavable分离为一个单独的数据帧,然后尝试合并。我也尝试过使用tidyverse,但一直无法做到

这里有一个tidyverse方法,可以使用tidyr软件包中的“收集和传播”来完成。请注意,这可能仅在需要将HoursAvailable合并到许多变量中时才有用。否则,在注释中使用base R表示的@KevinArseneau将更简单。

图书馆管理员 df% gatherkey,值,-cID,小时可用%>% mutatevalue=if_elseis.navalue,value,HoursAvailable%>% spreadkey,值%>% selectID、数学、化学、小时可用 >一个tibble:3x4 >ID数学化学小时可用 > * > 1 1 3:00-4:00 3:00-4:00 > 2 2 4:00-5:00 4:00-5:00 > 3 3 12:00-2:00 12:00-2:00 12:00-2:00 这里有一个tidyverse方法,可以使用tidyr包中的聚集和传播。请注意,这可能仅在需要将HoursAvailable合并到许多变量中时才有用。否则,在注释中使用base R表示的@KevinArseneau将更简单。

图书馆管理员 df% gatherkey,值,-cID,小时可用%>% mutatevalue=if_elseis.navalue,value,HoursAvailable%>% spreadkey,值%>% selectID、数学、化学、小时可用 >一个tibble:3x4 >ID数学化学小时可用 > * > 1 1 3:00-4:00 3:00-4:00 > 2 2 4:00-5:00 4:00-5:00 > 3 3 12:00-2:00 12:00-2:00 12:00-2:00 基尔

df[,c('Math', 'Chem')][!is.na(df[,c('Math', 'Chem')])]=df[,c('HoursAvailable','HoursAvailable')][!is.na(df[,c('Math', 'Chem')])]

df
  ID       Math       Chem HoursAvailable
1  1  3:00-4:00       <NA>      3:00-4:00
2  2       <NA>  4:00-5:00      4:00-5:00
3  3 12:00-2:00 12:00-2:00     12:00-2:00
基尔

df[,c('Math', 'Chem')][!is.na(df[,c('Math', 'Chem')])]=df[,c('HoursAvailable','HoursAvailable')][!is.na(df[,c('Math', 'Chem')])]

df
  ID       Math       Chem HoursAvailable
1  1  3:00-4:00       <NA>      3:00-4:00
2  2       <NA>  4:00-5:00      4:00-5:00
3  3 12:00-2:00 12:00-2:00     12:00-2:00
您可以使用dplyr::mutate和ifelse来访问数据结构

library(dplyr)
# example data
df1 <- structure(list(ID = 1:3, Math = c("Math", NA, "Math"), 
                                Chem = c(NA, "Chem", "Chem"), 
                                HoursAvailable = c("3:00-4:00", "4:00-5:00", "12:00-2:00")),
                                .Names = c("ID", "Math", "Chem", "HoursAvailable"), 
                                class = "data.frame", row.names = c(NA, -3L))

df1 %>% 
  mutate(Math = ifelse(is.na(Math), NA, HoursAvailable), 
         Chem = ifelse(is.na(Chem), NA, HoursAvailable))

  ID       Math       Chem HoursAvailable
1  1  3:00-4:00       <NA>      3:00-4:00
2  2       <NA>  4:00-5:00      4:00-5:00
3  3 12:00-2:00 12:00-2:00     12:00-2:00
然而,我会进一步创建一个整洁的数据框架:一个在一列中包含主题,另一列中包含小时

library(tidyr)
df1 %>% 
  mutate(Math = ifelse(is.na(Math), NA, HoursAvailable), 
         Chem = ifelse(is.na(Chem), NA, HoursAvailable)) %>% 
  select(-HoursAvailable) %>% 
  gather(subject, hours, -ID)

  ID subject      hours
1  1    Math  3:00-4:00
2  2    Math       <NA>
3  3    Math 12:00-2:00
4  1    Chem       <NA>
5  2    Chem  4:00-5:00
6  3    Chem 12:00-2:00
您还可以将%>%na.ommit添加到末尾,以删除带有na的行。

您可以使用dplyr::mutate和ifelse访问数据结构

library(dplyr)
# example data
df1 <- structure(list(ID = 1:3, Math = c("Math", NA, "Math"), 
                                Chem = c(NA, "Chem", "Chem"), 
                                HoursAvailable = c("3:00-4:00", "4:00-5:00", "12:00-2:00")),
                                .Names = c("ID", "Math", "Chem", "HoursAvailable"), 
                                class = "data.frame", row.names = c(NA, -3L))

df1 %>% 
  mutate(Math = ifelse(is.na(Math), NA, HoursAvailable), 
         Chem = ifelse(is.na(Chem), NA, HoursAvailable))

  ID       Math       Chem HoursAvailable
1  1  3:00-4:00       <NA>      3:00-4:00
2  2       <NA>  4:00-5:00      4:00-5:00
3  3 12:00-2:00 12:00-2:00     12:00-2:00
然而,我会进一步创建一个整洁的数据框架:一个在一列中包含主题,另一列中包含小时

library(tidyr)
df1 %>% 
  mutate(Math = ifelse(is.na(Math), NA, HoursAvailable), 
         Chem = ifelse(is.na(Chem), NA, HoursAvailable)) %>% 
  select(-HoursAvailable) %>% 
  gather(subject, hours, -ID)

  ID subject      hours
1  1    Math  3:00-4:00
2  2    Math       <NA>
3  3    Math 12:00-2:00
4  1    Chem       <NA>
5  2    Chem  4:00-5:00
6  3    Chem 12:00-2:00

您还可以添加%>%na。在结尾处省略,以删除带有na的行。

我认为您使用的是数据帧,而不是数据库?您是对的,我不小心使用了错误的术语。更新以反映这一点。似乎是一个直截了当的ifelse问题,您可以使用mutatedf,Math=ifelseis.naMath,NA,HoursAvailable@KevinArseneau是的,但是实际的数据库有许多不同的列,我不知道如何在不离散地命名列的情况下进行命名。我认为您正在处理数据帧,不是数据库?你说得对,我不小心用错了词。更新以反映这一点。似乎是一个直截了当的ifelse问题,您可以使用mutatedf,Math=ifelseis.naMath,NA,HoursAvailable@KevinArseneau是的,但是实际的数据库有许多不同的列,我不知道如果不离散地命名这些列,怎么做。