当前位置: 首页 > 知识库问答 >
问题:

r:从两列展开二进制值序列

董花蜂
2023-03-14

我有一个非常复杂的数据集。但为了简化,我将使用这些数据。假设我们有这个数据,一列X显示不同范围内的数字,另一列是二进制0/1。我想将二进制0/1的序列扩展为1。这将创建新的更长的列(newX,newbinary),形成原始的X和二进制列。

  X    binary
1 1    1
2 3    0
3 5    0
4 6    1
5 8    1
6 10   0

我想在这里扩展 X 列并将二进制值放在它旁边。像这样,

   newX    newbinary
1   1       1
2   2       1
3   3       0
4   4       0
5   5       0
6   6       1
7   7       1
8   8       1
9   9       1
10  10      0

我的尝试是,首先我创建了新的X列(扩展了X)。

   newX <- seq(X[1], X[length])

然后,我使用for循环遍历newX,然后将该值与X进行比较,以检查它是否等于或小于该值。如果newX[i]不等于X[i】,则放入前一个二进制值,否则放入二进制值[i]。

    for (i in 1:newX[length])
  {
    newbinary= ifelse((newX != X)&(between(newX[i], X[i],X[j+1])), lag(binary), binary)
   }

但这不管用,把这个给我,

   newX    newbinary
  1 1         1
  2 2        NA
  3 3        NA
  4 4        NA
  5 5        NA
  6 6        NA

我真的不知道newX列(较长的一个)将如何遍历X(较短的一个)并相应地放置值。

如何在R中实现这一点?

共有3个答案

艾意蕴
2023-03-14

假设注释末尾可再现地显示数据帧,下面的一个线性使用<代码>读取。zoo将其转换为zoo对象,并将其转换成ts对象,同时将其展开。然后它使用na。locf来填写NAs并加强防御。zoo将其转换为data.frame。将数据帧上的名称设置为原始名称。

library(zoo)
setNames(fortify.zoo(na.locf(as.ts(read.zoo(DF)))), names(DF))

给:

    X binary
1   1      1
2   2      1
3   3      0
4   4      0
5   5      0
6   6      1
7   7      1
8   8      1
9   9      1
10 10      0

上述一个线性可以交替地写为流水线:

library(zoo)
library(magrittr)

DF %>%
  read.zoo %>%
  as.ts %>%
  na.locf %>%
  fortify.zoo %>%
  setNames(names(DF))
Lines <- "
  X    binary
1 1    1
2 3    0
3 5    0
4 6    1
5 8    1
6 10   0"
DF <- read.table(text = Lines)
施永宁
2023-03-14

这是否有效:

library(dplyr)
library(tidyr)
library(purrr)
df %>% mutate(y = lead(X, default = max(X)+1), newX = map2(X,y-1,`:`)) %>% 
   unnest(newX) %>% mutate(newbinary = binary) %>% select(newX, newbinary)
# A tibble: 10 x 2
    newX newbinary
   <int>     <dbl>
 1     1         1
 2     2         1
 3     3         0
 4     4         0
 5     5         0
 6     6         1
 7     7         1
 8     8         1
 9     9         1
10    10         0

使用的数据:

df
# A tibble: 6 x 2
      X binary
  <dbl>  <dbl>
1     1      1
2     3      0
3     5      0
4     6      1
5     8      1
6    10      0
公良育
2023-03-14

尝试这种< code>tidyverse方法,为序列创建一个数据帧,然后使用< code>left_join()并最终使用< code>fill()来完成二进制变量:

library(dplyr)
library(tidyr)
#Code
newdf <- data.frame(X=seq(min(df$X),max(df$X),by=1)) %>%
  left_join(df) %>%
  fill(binary)

输出:

    X binary
1   1      1
2   2      1
3   3      0
4   4      0
5   5      0
6   6      1
7   7      1
8   8      1
9   9      1
10 10      0

使用的一些数据:

#Data
df <- structure(list(X = c(1L, 3L, 5L, 6L, 8L, 10L), binary = c(1L, 
0L, 0L, 1L, 1L, 0L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
 类似资料:
  • 我有一张时间和二进制值的表, 我想在一秒钟后检查二进制列中的值是1还是0,然后创建新值的新列。这里的时间没有继续。例如,这里的第一个值是(358.214),二进制值是1,如果我添加第二个值,它将是(359.214),基于上一个值,该值仍然是1,因为(359.214)不在数据集中。 我想添加两个新列,一个用于秒递增,一个用于新的二进制值。 我如何在R中做到这一点? 数据集, 更新我的尝试: 首先,我

  • 主要内容:语法,实例二进制文件是一个文件,其中包含仅以位和字节形式存储的信息(和)。它们不可读,因为其中的字节转换为包含许多其他不可打印字符的字符和符号。尝试使用任何文本编辑器读取二进制文件将显示为类似和这样的字符。 二进制文件必须由特定程序读取才能使用。例如,Microsoft Word程序的二进制文件只能通过Word程序读取到人类可读的形式。这表明,除了人类可读的文本之外,还有更多的信息,如格式化的字符和页码等,

  • 问题内容: 我必须报价, 1.将帐户保存到二进制(序列化)文件中。2.从二进制(序列化)文件加载(重新创建)帐户。 因此,首先,我正在查找确切的例子,而我却迷失了自己,在同样的情况下,人们提到xml,在我的脑海中,我认为它的意思像01010011000(二进制),而当我查看其他代码时,它看起来就像是正常的文本文件保存。 他到底是什么意思,有人可以举一个例子,或者给我一个更好地阐明这一点的网站吗?一

  • 本文向大家介绍什么是C#中的二进制序列化和反序列化?如何在C#中实现二进制序列化?,包括了什么是C#中的二进制序列化和反序列化?如何在C#中实现二进制序列化?的使用技巧和注意事项,需要的朋友参考一下 将对象转换为非人类可读格式的二进制格式称为二进制序列化。 将二进制格式转换回人类可读格式称为反序列化? 为了在C#中实现二进制序列化,我们必须使用库System.Runtime.Serializati

  • 本文向大家介绍C#二进制序列化实例分析,包括了C#二进制序列化实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#二进制序列化的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我有一些二进制数据,它们在Python中是字节字符串数组的形式。 是否有一种可移植的方式来序列化其他语言可以读取的数据? JSON丢失了,因为我刚刚发现它没有存储二进制数据的真正方法。其字符串应为Unicode。 我不想使用,因为我不想存在安全风险,因此将其限制在其他Python程序中使用。 有什么建议吗?我真的很想使用内置库(或至少是标准Anaconda发行版中的一个库)。 问题答案