将列的子集从一个数据帧复制到另一个数据帧

时间:2017-09-06 21:06:07

标签: r

我有两个数据帧s1和s2。我想基于匹配的id生成s3。

 > s1
  Type id status
1    B  3      0
2    B  4      0
3    S  2      1
4    B  1      2

> s2
  id status
1  3     88
2  4     99


> s3
  Type id status
1    B  3     88
2    B  4     99
3    S  2      1
4    B  1      2


s1=data.frame('Type'=c('B', 'B', 'S', 'B'), 'id'=c(3,4,2,1), 'status'=c(0,0,1,2))
s2=data.frame('id'=c(3,4), 'status'=c(88,99))

我尝试了类似这样的东西,但只有在订购了ID时才会起作用

s1[s1$id %in% match(s2$id,s1$id),]$status <- s2$status

3 个答案:

答案 0 :(得分:1)

尝试

s1$status <- ifelse(is.na(match(s1$id, s2$id)), s1$status, s2$status[match(s1$id, s2$id)])

  Type id status
1    B  3     88
2    B  4     99
3    S  2      1
4    B  1      2

答案 1 :(得分:0)

或使用dplyr

library(dplyr)

s1 <- data.frame('Type'=c('B', 'B', 'S', 'B'), 'id'=c(3,4,2,1), 'status'=c(0,0,1,2))
s2 <- data.frame('id'=c(3,4), 'status'=c(88,99))

s3 <- left_join(s1, s2, by = "id", suffix = c('_s1', '_s2')) %>% 
  mutate(status = coalesce(status_s2, status_s1)) %>% 
  select(-status_s1, -status_s2)

s3

答案 2 :(得分:0)

如果您要替换的状态值始终为0,则可以使用<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" /> merge

rowSums

创建以下内容:

s3 <- data.frame(s1[,1:2],status=rowSums(merge(s1,s2,by='id',all=T,sort=F)[,3:4], na.rm = T))