R 如何分离包含NA和#xB4的列;是NA's的吗?
这是我第一次问问题,所以请宽容一点:) 我认为这很简单。我有一个data.frame,它由一列“Time”组成。看起来是这样的:R 如何分离包含NA和#xB4的列;是NA's的吗?,r,numbers,dataframe,na,R,Numbers,Dataframe,Na,这是我第一次问问题,所以请宽容一点:) 我认为这很简单。我有一个data.frame,它由一列“Time”组成。看起来是这样的: ------------------------- > head(Times,10) Times 1 NA 2 0.448 3 0.130 4 NA 5 NA 6 0.462 7 0.427 8 0.946 9 0.227 10 NA > ------------------------ 其思想是,第一个N
-------------------------
> head(Times,10)
Times
1 NA
2 0.448
3 0.130
4 NA
5 NA
6 0.462
7 0.427
8 0.946
9 0.227
10 NA
>
------------------------
其思想是,第一个NA表示序列的开始,因此,后续时间应来自同一标签。到达下一个NA条目后,序列完成
我现在想创建一个新的data.frame,它将NA之间的数字分成一列,并按行分隔序列
Time1 Time2 Time3 Time4
1 0.448 0.130 0.123
2 0.462 0.427 0.946 0.227
>
---------------------------------
您能帮忙吗?
TimesTimes这里有一个使用dplyr
和tidyr
的解决方案:
Times <- read.table(text = "Times
1 NA
2 0.448
3 0.130
4 NA
5 NA
6 0.462
7 0.427
8 0.946
9 0.227
10 NA", header = TRUE)
#identify values that belong together
Times$ind <- cumsum(is.na(Times$Times)) %/% 2 + 1
Times <- na.omit(Times) #remove NA values
#identify columns
Times$col <- unlist(tapply(Times$ind, factor(Times$ind), seq_along))
#reshape to wide format
reshape(Times, timevar = "col", idvar = "ind", direction = "wide")
# ind Times.1 Times.2 Times.3 Times.4
#2 1 0.448 0.130 NA NA
#6 2 0.462 0.427 0.946 0.227
library(dplyr)
library(tidyr)
Times %>% filter(!(is.na(Times) & is.na(lead(Times)))) %>%
mutate(series = cumsum(is.na(Times))) %>%
filter(!is.na(Times)) %>%
group_by(series) %>%
mutate(count = paste0("Times.", row_number())) %>%
spread(count, Times)
Source: local data frame [2 x 5]
series Times.1 Times.2 Times.3 Times.4
(int) (dbl) (dbl) (dbl) (dbl)
1 1 0.448 0.130 NA NA
2 2 0.462 0.427 0.946 0.227
下面是一个使用dplyr
和tidyr
的解决方案:
library(dplyr)
library(tidyr)
Times %>% filter(!(is.na(Times) & is.na(lead(Times)))) %>%
mutate(series = cumsum(is.na(Times))) %>%
filter(!is.na(Times)) %>%
group_by(series) %>%
mutate(count = paste0("Times.", row_number())) %>%
spread(count, Times)
Source: local data frame [2 x 5]
series Times.1 Times.2 Times.3 Times.4
(int) (dbl) (dbl) (dbl) (dbl)
1 1 0.448 0.130 NA NA
2 2 0.462 0.427 0.946 0.227
使用数据。表v1.9.6
(使用@Roland答案中的数据):
您可以使用paste0(“Times”,rle)
获取列名称,如您的问题所示。使用数据。表v1.9.6
(使用@Roland答案中的数据):
您可以使用paste0(“Times”,rle)
获取Q中所示的列名。0.123
从何而来?我对您的示例目标df感到困惑。行是序列,但在示例输入中,第一行应该只有两列。您的新df[1,3]==”正确吗?同时,使用此功能,我感到如果可以,您可以通过删除每次运行之间的第二个NA
来减少管理。如果您有一个NA
就足以表示一个序列的结束和下一个序列的开始…对不起,示例目标df是我自己制作的,因此显然是错误的,第一行确实应该只有两列…感谢您的帮助:)0.123
从何而来?我对您的示例目标df感到困惑。行是序列,但在示例输入中,第一行应该只有两列。您的新df[1,3]==”正确吗?同时,使用此功能,我感到如果可以,您可以通过删除每次运行之间的第二个NA
来减少管理。如果您有一个NA
就足以表示一个序列的结束和下一个序列的开始…很抱歉,示例目标df是我自己制作的,因此显然是错误的,第一行确实应该只有两列…感谢您的帮助:)install.packages中的警告:package“data.table v1.9.6”不可用(对于R版本3.0.0)…d'oh安装中的警告。软件包:软件包“data.table v1.9.6”不可用(对于R版本3.0.0)…d'oh