【问题标题】:Overwrite values of existing dataframe覆盖现有数据框的值
【发布时间】:2014-04-06 12:40:43
【问题描述】:

如果有一个数据框包含 2 种类型的观察值,由 ID 编码(id.1id.2)和相应的值(val.1val.2)以及本示例中由@987654326 表示的其他几个数据@。

set.seed(1)
# df.master
id.1= c("abc", "def", "ghi", "jkl")
val.1= c(1, 2, 3, 4)
id.2= c("mno", "pqr", "stu", "vwx")
val.2= c(5, 6, 7, 8)
val.other= rep(runif(1),4)
df.master= data.frame(id.1, id.2, val.other, val.1, val.2)

df.master 看起来像:

  id.1 id.2 val.other val.1 val.2
1  abc  mno 0.2655087     1     5
2  def  pqr 0.2655087     2     6
3  ghi  stu 0.2655087     3     7
4  jkl  vwx 0.2655087     4     8

我生成的新数据分别存储在第二个和第三个数据帧df.new.1df.new.2

df.new.1 看起来像:

  id.3 val.3
1  abc    10
2  ghi    20
3  stu    30

# Create an 2nd data frame, which contains new values
id.3= c("abc", "ghi", "stu")
val.3= c(10, 20, 30)
df.new.1= data.frame(id.3, val.3)

df.new.2 看起来像:

  id.4 val.4
1  def   100
2  vwx   200

# Create an 3rd data frame, which contains new values
id.4= c("def", "vwx")
val.4= c(100, 200)
df.new.2= data.frame(id.4, val.4)

我想根据df.new.1df.new.2 的内容更新df.master,同时保持df.master 的原始结构导致以下结果:

  id.1 id.2 val.other val.1 val.2
1  abc  mno 0.2655087    10     5
2  def  pqr 0.2655087   100     6
3  ghi  stu 0.2655087    20    30
4  jkl  vwx 0.2655087     4   200

请注意,df.new.1df.new.2 包含与 id.1id.2df.master 匹配的新数据。

对执行df.master更新的代码有什么建议吗?

【问题讨论】:

标签: r dataframe


【解决方案1】:

以下内容可能会有所帮助:

ids_mat = as.matrix(df.master[c("id.1", "id.2")])
mat_inds = arrayInd(match(df.new.1$id.3, ids_mat), dim(ids_mat))
df.master[c("val.1", "val.2")][mat_inds] <- df.new.1$val.3
df.master
#  id.1 id.2 val.other val.1 val.2
#1  abc  mno 0.2655087    10     5
#2  def  pqr 0.2655087     2     6
#3  ghi  stu 0.2655087    20    30
#4  jkl  vwx 0.2655087     4     8

df.new.2 的逻辑相同。

【讨论】:

    【解决方案2】:

    如果您在 df.master 的两列中有两次相同的 id,则此代码将无法正常工作(两者都更改)

    for(i in 1:length(df.new.1[,1])){
       tmp <- grep(pattern=df.new.1[i,1], x=df.master[,1])
       if(length(tmp)==1){  # if found anything
           df.master[tmp,4] <- df.new.1[i,2]
       }
       tmp <- grep(pattern=df.new.1[i,1], x=df.master[,2])
       if(length(tmp)==1){  # if found anything
           df.master[tmp,5] <- df.new.1[i,2]
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2020-08-30
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多