【问题标题】:Using a data.frame to update another (character vectors) [duplicate]使用 data.frame 更新另一个(字符向量)[重复]
【发布时间】:2016-03-01 17:44:26
【问题描述】:

我已经阅读了对这个问题的回答:

Using one data.frame to update another

答案似乎有效,但仅适用于整数。我正在尝试更新某个数据框,称为“原始”:

original = data.frame( Name = c("Drug A","Drug B") , Id = c( 1 , 2) , Value1 = c("Yellow",NA), Value2 = c(NA,"Blue") )

使用将覆盖某些值的替换 data.frame:

replacement = data.frame( Name = c("Drug B") , Id = 2 , Value1 = "Red" , Value2 = "Orange")

最终应该是这样的:

goal = data.frame( Name = c("Drug A","Drug B") , Id = c( 1 , 2) , Value1 = c("Yellow","Red"), Value2 = c(NA,"Orange") )

与上一个问题一样,该解决方案应该适用于任意长度和/或大小的表格。有什么想法吗?

【问题讨论】:

  • 先把factor类转换成character类再做original[match(replacement$Name, original$Name), 3:4] <- replacement[, 3:4]

标签: r indexing dataframe


【解决方案1】:

与 all.x=TRUE 合并并替换其中任一值列为非 NA 的行的值:

goal <- merge(original, replacement, by=c("Name", "Id") ,all.x=TRUE)
goal
#----
    Name Id Value1.x Value2.x Value1.y Value2.y
1 Drug A  1   Yellow     <NA>     <NA>     <NA>
2 Drug B  2     <NA>     Blue      Red   Orange

goal [ !is.na(goal$Value1.y)&!is.na(goal$Value2.y), c("Value1.x", "Value2.x")] <-
 goal [ !is.na(goal$Value1.y)&!is.na(goal$Value2.y), c("Value1.y", "Value2.y")]
 goal
 #------
Name Id Value1.x Value2.x Value1.y Value2.y
1 Drug A  1   Yellow     <NA>     <NA>     <NA>
2 Drug B  2      Red   Orange      Red   Orange

 goal[-(5:6)]
 #------
    Name Id Value1.x Value2.x
1 Drug A  1   Yellow     <NA>
2 Drug B  2      Red   Orange

正如已经提到的,这需要使用字符向量而不是因子来完成。我的数据设置通过 stringsAsFactors =TRUE 避免了这个新手陷阱(在我无数次陷入其中之后):

 (original = data.frame( Name = c("Drug A","Drug B") , Id = c( 1 , 2) , 
                         Value1 = c("Yellow",NA), Value2 = c(NA,"Blue") , 
                         stringsAsFactors=FALSE))

(replacement = data.frame( Name = c("Drug B") , Id = 2 , Value1 = "Red" , 
                           Value2 = "Orange" , stringsAsFactors=FALSE))

(goal = data.frame( Name = c("Drug A","Drug B") , Id = c( 1 , 2) , 
                    Value1 = c("Yellow","Red"), Value2 = c(NA,"Orange") , 
                    stringsAsFactors=FALSE ))

这可以在全局范围内完成(在data.frame 或其他数据输入调用之前)。一些 R 商店一直使用此选项运行,如果您使用 R 进行数据管理,那么我认为将其视为您的操作方式是明智的:

  options(stringsAsFactors=FALSE)

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多