【问题标题】:data re-coding in csv filecsv文件中的数据重新编码
【发布时间】:2015-12-29 00:58:53
【问题描述】:

我是使用 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

在上面的数据文件中,空格表示缺失值。现在我想将 5 放入从 s=2 开始到 e=6 结束的变量中,e.i.从 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 文件中。如果你能解决这个问题,那就太好了。

【问题讨论】:

  • s、e、d值为空白的行有什么作用?
  • 第一个表第2行-第3列(4)的值不对?
  • @euanM s, e, d 为空白的那一行,大概意思是他想保留那一行。
  • 是的,Teja,你是对的.....PereG:实际上你检测到的值只是一个条件,我犯了错误,但这不应该是一个问题......非常感谢....

标签: r csv


【解决方案1】:

由于您没有提供真实数据的可重现示例,因此我的回答将是一个试探性的回答。可能您没有唯一的那些列和名称,所以以此为起点。可能还有一种更有效的方式(更少的击键)来实现你想要的,这只是一种方式。 我正在使用来自dplyr 包的mutate 函数:

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)

【讨论】:

  • 或者只是mutate_each_(A, funs(ifelse(d &gt; 1 &amp; is.na(.), 5, .)), names(A)[-(1:4)])
  • @PierreLafortune 这太棒了。
  • 非常感谢,终于可以运行命令了.....非常感谢.....
【解决方案2】:

Daniel 的解决方案是可行的,但由于您是 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

【讨论】:

  • 非常感谢,终于可以运行命令了.....非常感谢.....
猜你喜欢
  • 2015-06-02
  • 2021-12-28
  • 2020-05-10
  • 2021-11-16
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多