我有一个数据表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
感谢您的帮助,
答案 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)
原始数据。表:
将数据类型转换为字符,以便替换有效:
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 强>
答案 3 :(得分:0)
我认为这应该有效。您可以在R中按名称引用列。但是下次请以我们可以使用构造函数代码write_csv
或dput
轻松复制到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