替换R中数据表中每行的值

时间:2018-01-20 01:47:25

标签: r indexing data.table

我有一个数据表DT,看起来像这样。对于每一行,我想根据变量“position”和“value”替换一个元素。

 DT=data.table(ID=c(1,2,3,4,8,6,12,8,9), position=c('A3',      
   'A1','B2','A2','B1','B3','B2','A1','B3'),
   value=c(15,22,92,17,55,37,16,35,13), A1= NA,A2=NA, A3=NA, B1=NA, B2=NA,  
    B3=NA)

         ID position value   A1  A2  A3  B1  B2  B3
 1:      1   A3        15    NA  NA  NA  NA  NA  NA 
 2:      2   A1        22    NA  NA  NA  NA  NA  NA 
 3:      3   B2        92    NA  NA  NA  NA  NA  NA 
 4:      4   A2        17    NA  NA  NA  NA  NA  NA 
 5:      8   B1        55    NA  NA  NA  NA  NA  NA
 6:      6   B3        37    NA  NA  NA  NA  NA  NA 
 7:     12   B2        16    NA  NA  NA  NA  NA  NA
 8:      8   A1        35    NA  NA  NA  NA  NA  NA
 9:      9   B3        13    NA  NA  NA  NA  NA  NA

对于第1行,我想更改DT [1,A3:= 15]。 A3是来自同一行的位置变量,15来自同一行的值列。

我目前的代码是:

for (i in 1:nrow(DT)){ 
   # find the column number position of the targeted column first
  column_position<-which.first(colnames(DT) == DT$position[i])

  LOB[i,(column_position) := LOB[i,value] ]
}

以来这不起作用
  LOB[i,(column_position)]

不是一个好的索引,然后我尝试了

     LOB[i,paste0(LOB[i,position])]

用于索引,这也不起作用。

期望的输出,

         ID position value   A1  A2  A3  B1  B2  B3
 1:      1   A3        15    NA  NA  15  NA  NA  NA 
 2:      2   A1        22    22  NA  NA  NA  NA  NA 
 3:      3   B2        92    NA  NA  NA  NA  92  NA 
 4:      4   A2        17    NA  17  NA  NA  NA  NA 
 5:      8   B1        55    NA  NA  NA  55  NA  NA
 6:      6   B3        37    NA  NA  NA  NA  NA  37 
 7:     12   B2        16    NA  NA  NA  NA  16  NA
 8:      8   A1        35    35  NA  NA  NA  NA  NA
 9:      9   B3        13    NA  NA  NA  NA  NA  13

感谢您的帮助,

5 个答案:

答案 0 :(得分:1)

我确信更有经验的人可以解除这个,但这很有效。

编辑:使用给定的构造代码:

$(document).ready(function()
{
  // ulrs of some existing backgrounds          
  var backgrounds = {
    wood: "https://images.duckduckgo.com/iu/?u=https%3A%2F%2Fwww.walldevil.com%2Fwallpapers%2Fa81%2Fwallpapers-dragon-art-yellow-artistic-silver-images-backgrounds-nature-abstract-background-desktop-cool.jpg&f=1",
    nature: "https://images.duckduckgo.com/iu/?u=https%3A%2F%2Fimage.freepik.com%2Ffree-photo%2Fnature-design-with-bokeh-effect_1048-1882.jpg&f=1"
  };

  var settings = loadSettings();
  setBackground(settings.background);  

  document.getElementById("bc-wood-button").addEventListener("click", WoodenBackground);
  document.getElementById("bc-nature-button").addEventListener("click", NatureBackground);

  function setBackground(background) {
    $('body').css('background-image', 'url("'+background+'")');
    localStorage.setItem("settings.background", background);
  }

  function WoodenBackground() {
    setBackground(backgrounds.wood);
  }

  function NatureBackground()
  {
    setBackground(backgrounds.nature);
  }

  function loadSettings() 
  {
    var background = localStorage.getItem("settings.background");
    // at first run there is no data, also user may anytime clear storage
    if (!background) 
    {
      background =  backgrounds.wood;
    }
    return { background: background }
  }
});

答案 1 :(得分:1)

尽量不要遍历所有行。如果你有很多行,这将是非常缓慢的。而是循环通过独特的位置。

library(data.table)

# do not add columns A1, A2 ,...
DT=data.table(ID=c(1,2,3,4,8,6,12,8,9), 
              position=c('A3', 'A1','B2','A2','B1','B3','B2','A1','B3'),
              value=c(15,22,92,17,55,37,16,35,13))

# find unique positions
aaa <- sort(DT[, unique(position)])

# do not loop all rows, which is slow
for (pos in aaa){
    DT[position == pos, (pos) := value]
}

#    ID position value A1 A2 A3 B1 B2 B3
# 1:  1       A3    15 NA NA 15 NA NA NA
# 2:  2       A1    22 22 NA NA NA NA NA
# 3:  3       B2    92 NA NA NA NA 92 NA
# 4:  4       A2    17 NA 17 NA NA NA NA
# 5:  8       B1    55 NA NA NA 55 NA NA
# 6:  6       B3    37 NA NA NA NA NA 37
# 7: 12       B2    16 NA NA NA NA 16 NA
# 8:  8       A1    35 35 NA NA NA NA NA
# 9:  9       B3    13 NA NA NA NA NA 13

答案 2 :(得分:1)

原始数据。表:

enter image description here

将数据类型转换为字符,以便替换有效:

dt <- dt[, lapply(.SD, as.character), by=ID]

有条件地替换data.table中的值的简单循环:

for(row in 1:nrow(dt)) {
    pos <- dt[[row,'position']]
    val <- dt[[row,'value']]
    set(dt, i=row, j=pos, value=val)
}

<强> DT

enter image description here

答案 3 :(得分:0)

我认为这应该有效。您可以在R中按名称引用列。但是下次请以我们可以使用构造函数代码write_csvdput轻松复制到R中的方式提供数据,因为没有它我们无法测试代码

for (i in 1:nrow(DT)){
    colname <- DT[i, "position"] # Get colname as string
    DT[i, colname] <- DT[i, "value"] # Replace value
}

答案 4 :(得分:0)

为什么不进行广播?

DT <- DT[,c("ID", "position", "value")]
dcast.data.table(DT, ID ~ position, value.var = "value")


   ID A1 A2 A3 B1 B2 B3
1:  1 NA NA 15 NA NA NA
2:  2 22 NA NA NA NA NA
3:  3 NA NA NA NA 92 NA
4:  4 NA 17 NA NA NA NA
5:  6 NA NA NA NA NA 37
6:  8 35 NA NA 55 NA NA
7:  9 NA NA NA NA NA 13
8: 12 NA NA NA NA 16 NA