добавить столбец с разными номерами строк, используя R - PullRequest
2 голосов
/ 24 марта 2020

У меня есть следующие входные данные.

x <- c("a","b","c")
y <- c(1,2,3)
z <- c("M","N")

df1 = data.frame(x,y)
df2 = data.frame(df1,z)

Выходные данные:

Ошибка в data.frame (df1, z): аргументы подразумевают различное количество строк: 3, 2

Я хочу, чтобы итоговый кадр данных выглядел следующим образом:

x   y   z
a   1   M 
b   2   M 
c   3   M 
a   1   N 
b   2   N 
c   3   N

Спасибо за вашу помощь

Ответы [ 3 ]

3 голосов
/ 24 марта 2020

Эту операцию часто называют «перекрестным соединением» или «декартовым произведением». Вы можете использовать функцию merge для перекрестного соединения, установив by = NULL.

merge(df1, data.frame(z), by = NULL)
#   x y z
# 1 a 1 M
# 2 b 2 M
# 3 c 3 M
# 4 a 1 N
# 5 b 2 N
# 6 c 3 N

Если вы фанат tidyverse, вы также можете сделать tidyr::crossing(df1, z).

1 голос
/ 24 марта 2020

Мы можем использовать expand.grid

out <- expand.grid(v1 = row.names(df1), z)
cbind(df1[out$v1,], z = out['Var2'])

Или другой вариант - создать столбец list и unnest

library(dplyr)
library(tidyr)
df1 %>%
     mutate(z = list(z)) %>%
     unnest(c(z))
0 голосов
/ 24 марта 2020

Вы можете использовать rbind следующим образом для достижения sh желаемого результата:

df2 = rbind(data.frame(df1,z=z[1]),data.frame(df1,z=z[2]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...