如何使用R将某些数据从一个csv文件复制到另一个csv文件?



我是一个R(和一般编程)的新手,需要一些帮助:

我想将某些值从一个csv文件传输到另一个。csv1和csv2都有3列:"A", "B", "value"其中";a";和";B"是字符串。对于csv2中具有与csv1相同字符串的行(因此csv1中的A+B = csv2中的A+B)我想从csv1中传输值,否则我想拥有"na"作为输出。

到目前为止我所做的(这可能完全没有意义):

if (csv1$A == csv2$A & csv1$B == csv2$B)  {
   print(csv1$value for csv2$value)  ### I obviously can't use "for"!
else 
print ("na")
}
  }

下面是csv1

的一个例子和csv2

之一非常感谢你的帮助!(我很抱歉我没有编程技能…)

我相信这应该对你有用。您的思路是正确的,但是您需要遍历csv的行,并将比较的输出存储在csv2$value中。

==是精确等价所需要的逻辑运算符。

for循环告诉R按行遍历CSV。

for(i in 1:nrow(csv1)) {
if (csv1$A[i] == csv2$A[i] & csv1$B[i] == csv2$B[i])  {
csv2$value[i] <- csv2$value[i]
} else {
csv2$value[i] <- NA
}
}

@JCran,非常感谢你的帮助!

由于我的csv2文件没有与csv1文件相同的行数,我还在代码中添加了一个which函数-现在它可以工作了!

    for (i in (1:nrow(csv2))){
  matching_row_in_csv1 <- which((as.character(csv1$A) == as.character(csv2$A[i]))&(as.character(csv1$B)  == as.character(csv2$B[i])))
  if (length(matching_row_in_csv1) == 1){
    csv2$value[i] <- csv1$value[matching_row_in_csv1]
  } else {
    csv2$value[i] <- NA
  }
}

再次感谢!:)

有两种选择:

With base R您可以合并两个data.frames并重命名结果列

df_new <- merge(csv2, csv1, by=c("A", "B"), all.x = TRUE)
df_new$value <- df_new$value.y
df_new[,c("value.y", "value.x")] <- NULL

,

> df_new
        A       B value
1    bird feather  0.32
2 feather     pen    NA
3    moon     sun    NA

基本相同的方法使用dplyr -package:

library(dplyr)
csv2 %>% 
  left_join(csv1, by=c("A", "B")) %>% 
  select(A, B, value = value.y)

返回
# A tibble: 3 x 3
  A       B       value
  <chr>   <chr>   <dbl>
1 bird    feather  0.32
2 feather pen     NA   
3 moon    sun     NA 

两种方法都不使用for循环,您不需要比较每行数据帧中的元素。但是,与@JCRAN和您自己的答案相反,即使csv1和csv2中的数据排序不同,匹配也会完成。也许这种行为,通常是一个很大的优势,在这种情况下是不需要的。

相关内容

  • 没有找到相关文章

最新更新