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是的,但是实际的数据库有许多不同的列,我不知道如果不离散地命名这些列,怎么做。