Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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 如何分离包含NA和#xB4的列;是NA's的吗?_R_Numbers_Dataframe_Na - Fatal编程技术网

R 如何分离包含NA和#xB4的列;是NA's的吗?

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

这是我第一次问问题,所以请宽容一点:)

我认为这很简单。我有一个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
>
------------------------
其思想是,第一个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
>
---------------------------------

您能帮忙吗?

Times
Times这里有一个使用
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