我是一个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中的数据排序不同,匹配也会完成。也许这种行为,通常是一个很大的优势,在这种情况下是不需要的。