首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将新列从另一个更长的数据帧添加到R数据帧

将新列从另一个更长的数据帧添加到R数据帧
EN

Stack Overflow用户
提问于 2021-04-21 08:25:58
回答 3查看 35关注 0票数 2

我有两个不同信息的数据帧(只有一列在两个数据帧中是相同的:subject)。而且,其中一个数据帧比另一个数据帧长(更多的列和更多的行)。

所以,我有这样的东西:

代码语言:javascript
运行
复制
# drataframe 1

subject var1 var2
101      A    B
102      C    D
103      E    F
...

# dataframe 2

subject  varW varX varY varZ
101        1    2    1    4
101        2    1    1    4
101        4    1    1    4
102        2    1    2    5
102        1    1    2    5
102        2    4    2    5
103        2    3    3    1
103        1    2    3    1
103        4    1    3    1   

注意,每个主题在dataframe 2中重复多次,而在dataframe 1中,每个主题只出现一次。

我想要做的是将列varYvarZ附加到DataFrame1。

我尝试使用select (选择这两列),然后使用inner_join (连接两个数据帧)。但是,每个主题有3行,因为每个主题在dataframe 2中重复3次。一旦连接,我希望dataframe 1中的每个主题只有1行,因为每个主题在varYvarZ中只有一个值。

换句话说,这将是我想要的输出:

代码语言:javascript
运行
复制
subject var1 var2 varY varZ
101      A    B    1    4
102      C    D    2    5
103      E    F    3    1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-21 08:32:13

如果主题ed列具有唯一值,则使用distinct并通过‘select’进行连接

代码语言:javascript
运行
复制
library(dplyr)
distinct(df2, subject, varY, varZ) %>%
     right_join(df1) %>%
     select(names(df1), everything())

-output

代码语言:javascript
运行
复制
#   subject var1 var2 varY varZ
#1     101    A    B    1    4
#2     102    C    D    2    5
#3     103    E    F    3    1

数据

代码语言:javascript
运行
复制
df1 <- structure(list(subject = 101:103, var1 = c("A", "C", "E"),
var2 = c("B", 
"D", "F")), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(subject = c(101L, 101L, 101L, 102L, 102L, 102L, 
103L, 103L, 103L), varW = c(1L, 2L, 4L, 2L, 1L, 2L, 2L, 1L, 4L
), varX = c(2L, 1L, 1L, 1L, 1L, 4L, 3L, 2L, 1L), varY = c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), varZ = c(4L, 4L, 4L, 5L, 5L, 
5L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, -9L
))
票数 2
EN

Stack Overflow用户

发布于 2021-04-21 08:36:05

使用library(data.table)

代码语言:javascript
运行
复制
df1[df2[, .SD[1], .SDcols=c("varY", "varZ"), by=subject], on="subject"]

或者(来自@thelatemail的ty评论),

代码语言:javascript
运行
复制
df2[, .(subject, varY, varZ)][df1, on=.(subject), mult="first"]

数据:

代码语言:javascript
运行
复制
df1 = fread("
subject var1 var2
101      A    B
102      C    D
103      E    F
            ")

df2 = fread("
subject  varW varX varY varZ
101        1    2    1    4
101        2    1    1    4
101        4    1    1    4
102        2    1    2    5
102        1    1    2    5
102        2    4    2    5
103        2    3    3    1
103        1    2    3    1
103        4    1    3    1 
")
票数 3
EN

Stack Overflow用户

发布于 2021-04-21 08:37:05

我希望这就是你想要的:

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)

df2 %>%
  left_join(df1, by = "subject") %>%
  select(-c(varX, varW)) %>%
  group_by(subject) %>%
  slice_head(n = 1) %>%
  relocate(subject, var1, var2)

# A tibble: 3 x 5
# Groups:   subject [3]
  subject var1  var2   varY  varZ
    <dbl> <chr> <chr> <dbl> <dbl>
1     101 A     B         1     4
2     102 C     D         2     5
3     103 E     F         3     1

数据

代码语言:javascript
运行
复制
df2 <- tribble(
  ~subject,  ~varW, ~varX, ~varY, ~varZ,
  101,        1,    2,    1,    4,
  101,        2,    1,    1,    4,
  101,        4,    1,    1,    4,
  102,        2,    1,    2,    5,
  102,        1,    1,    2,    5,
  102,        2,    4,    2,    5,
  103,        2,    3,    3,    1,
  103,        1,    2,    3,    1,
  103,        4,    1,    3,    1
)

df1 <- tribble(
  ~subject, ~var1, ~var2,
  101,      "A",    "B",
  102,      "C",    "D",
  103,      "E",    "F"
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67187846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档