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

数据帧中每两列连接一次

姚兴安
2023-03-14

我有以下数据框:

X1   X2   X3   X4   X5   X6   X7
p1   H    I    K    J    K    H
p2   H    K    J    K    I    J
p3   J    K    H    I    J    K
p4   K    I    H    J    I    J

我想用列X1创建一个新的数据帧,并从X2开始连接每两列,因此最终表如下所示:

X1   X2    X3    X4   
p1   HI    KJ    KH
p2   HK    JK    IJ
p3   JK    HI    JK
p4   KI    HJ    IJ

共有3个答案

阎辰钊
2023-03-14

而tidyr的unite对小数据集很好:

library(tidyr)

df |>
  unite("X2", X2:X3, sep = "") |>
  unite("X4", X4:X5, sep = "") |>
  unite("X6", X6:X7, sep = "")

...我们可能想探索另一种通用方法。其中之一是旋转到更长的格式,将所有奇数列更改为前面的偶数(使用模运算符),然后旋转更长的时间,使用paste0折叠字符串。

library(tidyr)
library(dplyr)

df |>
    pivot_longer(-X1,
                 names_prefix = "X",
                 names_transform = as.numeric) |>
    mutate(name = if_else(name %% 2 == 1, name - 1, name)) |>
    pivot_wider(names_from = name,
                names_prefix = "X",
                values_fn = ~ paste0(., collapse = ""))

输出:

# A tibble: 4 × 4
  X1    X2    X4    X6   
  <chr> <chr> <chr> <chr>
1 p1    HI    KJ    KH   
2 p2    HK    JK    IJ   
3 p3    JK    HI    JK   
4 p4    KI    HJ    IJ   

数据:

library(readr)

df <- read_table("X1   X2   X3   X4   X5   X6   X7
p1   H    I    K    J    K    H
p2   H    K    J    K    I    J
p3   J    K    H    I    J    K
p4   K    I    H    J    I    J")

更新:

如果我们想从X3开始,你需要在两个地方更改代码。首先,不旋转两列(-c(X1,X2)),然后从偶数列中减去1(name%%2==0)。例如。

library(tidyr)
library(dplyr)

df |>
    pivot_longer(-c(X1, X2),
                 names_prefix = "X",
                 names_transform = as.numeric) |>
    mutate(name = if_else(name %% 2 == 0, name - 1, name)) |>
    pivot_wider(names_from = name,
                names_prefix = "X",
                values_fn = ~ paste0(., collapse = ""))

输出:

# A tibble: 4 × 5
  X1    X2    X3    X5    X7   
  <chr> <chr> <chr> <chr> <chr>
1 p1    H     IK    JK    H    
2 p2    H     KJ    KI    J    
3 p3    J     KH    IJ    K    
4 p4    K     IH    JI    J    

(这里当然没有X8可供组合。)

步衡
2023-03-14

基本R路

df=structure(list(X1 = c("p1", "p2", "p3", "p4"), X2 = c("H", "H", 
"J", "K"), X3 = c("I", "K", "K", "I"), X4 = c("K", "J", "H", 
"H"), X5 = c("J", "K", "I", "J"), X6 = c("K", "I", "J", "I"), 
    X7 = c("H", "J", "K", "J")), class = "data.frame", row.names = c(NA, 
-4L))

df1=data.frame(t(df))
df1$G=c(0,rep(1:((nrow(df1)-1)/2),each=2))

data.frame(
  t(
    aggregate(
      .~G,
      data=df1,
      paste0,
      collapse=""
    )[,-1]
  )
)

导致

   X1 X2 X3 X4
X1 p1 HI KJ KH
X2 p2 HK JK IJ
X3 p3 JK HI JK
X4 p4 KI HJ IJ
濮阳君浩
2023-03-14

使用mapply:

cbind(df[ 1 ],
      mapply(paste0, df[, seq(2, 7, 2)], df[, seq(3, 7, 2)]))
#   X1 X2 X4 X6
# 1 p1 HI KJ KH
# 2 p2 HK JK IJ
# 3 p3 JK HI JK
# 4 p4 KI HJ IJ
 类似资料:
  • 假设我有两个数据帧,具有不同级别的信息,如下所示: 我想加入df1和df2,并将“值”信息传递给df2:一天中的每一小时都将获得“日”值。 预期产出:

  • 你能帮我连接两个数据帧吗。 我有两个数据帧。 DF1: DF2: 我需要基于前两个数据帧创建一个数据帧,左连接两列。列index和val2在两个数据帧中具有相同的名称。df3的结果应该如下所示: 应该删除df1中不存在的df2中的索引,如果df1中的索引具有与df2中相同的val2,则应该将1添加到新的列val3中,否则:NaN。 非常感谢提前!

  • 我有两个数据帧需要以我正在努力的特定方式连接。 数据帧 1: 数据框2: 期望结果: 基本上-它应该在上连接df1和df2,但是如果df2中不存在,那么生成的应该是df1中的。 我尝试了 ),但这显然在列中留下了 以供 ,因为它在 df2 中没有匹配的域。对于此特定情况,我如何将它们添加到列中?

  • 我正在尝试将两个PySpark数据帧与仅位于其中一个上的列连接起来: 现在我想生成第三个数据帧。我想要像熊猫这样的东西: 这可能吗?

  • 我需要将两个数据帧和一个接一个地连接起来,它们具有相同的行数(),而不考虑任何键。此函数类似于

  • df1有每月时间索引,df2有季度时间索引。df1和df2有不同的行数和列数,我想:(1)并排连接它们并保持它们的索引。(2)输出到excel文件。 我尝试过pd.concat,但是这种方法连接基于我不想要的数据帧索引之一的数据帧 excel中的预期结果: