我是使用R的新手。实际上,如果我可以获得以下问题的代码,那将会很棒。 我有一个很大的没有。变量,但我只是为少数人提出。假设我有一个名为" A"的csv文件。以下形式:
s e d v1 v2 v3 v4 v5 v6
2 6 2 1
3 5 4 1 1 1
1 1 1 1 1
2 3 5 1 1 1 1
在上面的数据文件中,空格表示缺少值。现在我想在从s = 2开始到e = 6,e.i结束的变量中放入5。从v2到v6,如果变量d大于1.但是我想要列s& e作为条目的开始和结束的索引,我不希望直接包含任何数值,这样我就可以将这个程序用于大量的变量和案例,并为此输入5在数据文件中取决于s和e变量。例如如果s为2,则重新编码应从v2开始,如果e为6,则重新编码应在v6结束。现在我希望我的新表如下所示:
s e d v1 v2 v3 v4 v5 v6
2 6 2 1 5 5 5 5 5
3 5 0 1 1 1
1 1 1 1 1
2 3 5 1 5 5 1 1 1
在重新编码之后,我想将整个文件写在同一个名为' A'的CSV文件中。如果你能解决这个问题会很棒。
答案 0 :(得分:1)
由于您没有提供真实数据的可重现示例,我的答案将是暂定的。可能你没有唯一的列和名称,所以以此为出发点。可能还有一种更有效的方式(减少关键击球)来实现你想要的东西,这只是一种方式。
我正在使用mutate
包中的dplyr
函数:
library(dplyr)
A = read.table(text ="s,e,d,v1,v2,v3,v4,v5,v6
2,6,2,1,,,,,
3,5,4,1,1,,,,1
3,5,0,1,1,,,,1
,,,1,1,1,1,,1
2,3,5,1,,,1,1,1", sep=",", header=TRUE)
> A
s e d v1 v2 v3 v4 v5 v6
1 2 6 2 1 NA NA NA NA NA
2 3 5 4 1 1 NA NA NA 1
3 3 5 0 1 1 NA NA NA 1
4 NA NA NA 1 1 1 1 NA 1
5 2 3 5 1 NA NA 1 1 1
B <- mutate(A, v1 = ifelse(d>1 & is.na(v1), 5, v1),
v2 = ifelse(d>1 & is.na(v2), 5, v2),
v3 = ifelse(d>1 & is.na(v3), 5, v3),
v4 = ifelse(d>1 & is.na(v4), 5, v4),
v5 = ifelse(d>1 & is.na(v5), 5, v5),
v6 = ifelse(d>1 & is.na(v6), 5, v6))
> B
s e d v1 v2 v3 v4 v5 v6
1 2 6 2 1 5 5 5 5 5
2 3 5 4 1 1 5 5 5 1
3 3 5 0 1 1 NA NA NA 1
4 NA NA NA 1 1 1 1 NA 1
5 2 3 5 1 5 5 1 1 1
完成纠正数据后,只需编写CSV文件:
write.csv(B, file="outfile.csv", row.names=FALSE)
答案 1 :(得分:0)
解决方案是丹尼尔的作品,但是在这里你可能会发现另一个更容易,因为你是R的新手并且之前没有使用dplyr
。
so <- read.csv("so.txt")
for(row in 1:nrow(so)) {
if(so[row,"d"]>1 && !is.na(so[row,"s"]) && !is.na(so[row,"e"])) {
so[row,seq(so[row,"s"],so[row,"e"])+3] <- 5
}
}
write.csv(so, "so_new.txt")
文件so.txt
包含
s,e,d,v1,v2,v3,v4,v5,v6
2,6,2,1,NA,NA,NA,NA,NA
3,5,0,1,1,NA,NA,NA,1
NA,NA,NA,1,1,1,1,NA,1
2,3,5,1,NA,NA,1,1,1