微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将每隔一行添加到新列 - R 数据

如何解决将每隔一行添加到新列 - R 数据

我正在寻找一种简单的方法来将每隔一行添加到 R 中的新列。我有 NCAA 篮球队,它们在单独的连续行上互相比赛。下面的示例:St. Joes 正在玩 La Salle,而 Connecticut 正在玩 Seton Hall,等等。我希望每个“游戏”都在同一条线上。我搞乱了领先/滞后来解决这个问题,但这让我在第一行或最后一行出现错误,这取决于我使用的是哪一行。这是我的数据示例:

# current data

Team       spread   price
St. Joes     -3     -105
La Salle      3     -115
Connecticut  -1.5   -105
Seton Hall    1.5   -115
Minnesota     5.5   -110
Penn State   -5.5   -110


# desired output below

Team1       spread1  price1  Team2        spread2  price2
St. Joes    -3       -105    La Salle     3        -115
Connecticut -1.5     -105    Seton Hall   1.5      -115
Minnesota    5.5     -110    Penn State  -5.5      -110

解决方法

每两行创建一个组,并将行号指定为新列。使用 pivot_wider 将数据转换为宽格式。

library(dplyr)
library(tidyr)

df %>%
  group_by(grp = ceiling(row_number()/2)) %>%
  mutate(row  =row_number()) %>%
  pivot_wider(names_from = row,values_from = Team:price) %>%
  ungroup %>%
  select(-grp)

#  Team_1      Team_2    spread_1 spread_2 price_1 price_2
#  <chr>       <chr>        <dbl>    <dbl>   <int>   <int>
#1 St.Joes     LaSalle       -3        3      -105    -115
#2 Connecticut SetonHall     -1.5      1.5    -105    -115
#3 Minnesota   PennState      5.5     -5.5    -110    -110

数据

df <- structure(list(Team = c("St.Joes","LaSalle","Connecticut","SetonHall","Minnesota","PennState"),spread = c(-3,3,-1.5,1.5,5.5,-5.5),price = c(-105L,-115L,-105L,-110L,-110L)),class = "data.frame",row.names = c(NA,-6L))
,

使用 dcast 中的 data.table

library(data.table)
dcast(setDT(df)[,grp := gl(.N,2,.N)],grp ~ rowid(grp),value.var = setdiff(names(df),'grp'))[,grp := NULL][]
#        Team_1    Team_2 spread_1 spread_2 price_1 price_2
#1:     St.Joes   LaSalle     -3.0      3.0    -105    -115
#2: Connecticut SetonHall     -1.5      1.5    -105    -115
#3:   Minnesota PennState      5.5     -5.5    -110    -110

数据

df <- structure(list(Team = c("St.Joes",-6L))
,

使用 reshape 的基本 R 选项

reshape(
  cbind(df,p = rep_len(1:2,nrow(df)),q = ceiling(seq(nrow(df)) / 2)),direction = "wide",idvar = "q",timevar = "p"
)

给予

  q      Team.1 spread.1 price.1    Team.2 spread.2 price.2
1 1     St.Joes     -3.0    -105   LaSalle      3.0    -115
3 2 Connecticut     -1.5    -105 SetonHall      1.5    -115
5 3   Minnesota      5.5    -110 PennState     -5.5    -110

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。