【问题标题】:Add value from one data frame into another data frame in R将一个数据帧中的值添加到 R 中的另一个数据帧中
【发布时间】:2017-03-17 11:06:17
【问题描述】:

您好,我想使用 R 将行从一个数据帧添加到另一个数据帧。

我有一个数据帧 DATA1,其中缺少一些 ID,而 Data2 具有所有 ID,我想用 DATA1 值替换所有匹配 ID 的 DATA2 频率列。 我想要 OUTPUT 数据帧作为我的输出。

Data1
ID  frequency
1   1
2   7
3   11
5   4

DATA2
ID  frequency
1   0
2   0
3   0
4   0
5   0
6   0

Output
ID  frequency
1   1
2   7
3   11
4   0
5   4
6   0

【问题讨论】:

  • 我会使用DATA2[match(Data1$ID, DATA2$ID), 'frequency'] <- Data1$frequency
  • 沿着正确的路线,但这将替换 DATA2 中的值,而不是创建新的 Output
  • DATA2 是否总是只包含零,还是可以包含您可能不想替换的其他值?

标签: r


【解决方案1】:

如果数据 ID 是唯一的,我认为可以使用 ID 作为行名。

data1 <- data.frame(
  freq = c(1, 7, 11, 4),
  row.names = c(1, 2, 3, 5)
)

data2 <- data.frame(
  freq = rep(0,6),
  row.names = seq(1, 6)
)
output <- data2
apply(
  matrix(rownames(data1), ncol=1),
  1,
  function(x){
    output[x, 1] <<- data1[x, 1];
    return(NULL)
  }
)

结果是:

> output
  freq
1    1
2    7
3   11
4    0
5    4
6    0

【讨论】:

  • @RomilGarg 我的荣幸。
【解决方案2】:

您可以使用 data.table 进行连接。

library(data.table)
## set both data frames to data tables
setDT(Data1); setDT(Data2)
## copy 'Data2' to a new table 'Output' which we will assign values to
Output <- copy(Data2)
## join on 'ID' and assign by reference the relevant 'frequency' values
Output[Data1, frequency := i.frequency, on = "ID"]
Output
#    ID frequency
# 1:  1         1
# 2:  2         7
# 3:  3        11
# 4:  4         0
# 5:  5         4
# 6:  6         0

原始数据:

Data1 <- structure(list(ID = c(1L, 2L, 3L, 5L), frequency = c(1L, 7L, 
11L, 4L)), .Names = c("ID", "frequency"), class = "data.frame", row.names = c(NA, 
-4L))

Data2 <- structure(list(ID = 1:6, frequency = c(0L, 0L, 0L, 0L, 0L, 0L
)), .Names = c("ID", "frequency"), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

    【解决方案3】:

    我确定有一个优雅的单行解决方案,但dplyr 的方式是通过ID 加入数据帧,然后整理输出。

    library(dplyr)
    OUTPUT <- Data1 %>% 
                right_join(DATA2, by = "ID") %>%
                mutate(frequency = ifelse(is.na(frequency.x), frequency.y, frequency.x)) %>%
                select(ID, frequency)
    

    【讨论】:

    • 不,ifelse 是必需的。它将frequency.x 中的NA 值替换为frequency.y 中的相应值。只需运行正确的连接,无需后面的步骤,您就会明白为什么。
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多