csv文件中的数据重新编码

时间:2015-12-29 00:58:54

标签: r csv

我是使用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文件中。如果你能解决这个问题会很棒。

2 个答案:

答案 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