根据ID在data.frame中寻址单元格
我在R中有一个data.frame。它看起来像这样(但要大得多):根据ID在data.frame中寻址单元格,r,dataframe,R,Dataframe,我在R中有一个data.frame。它看起来像这样(但要大得多): 有什么方法可以做到这一点吗?这个问题似乎很简单,但在回答时需要考虑不同的方面 OP询问了如何替换与给定ID值匹配的行中特定列中的值 数据类型 首先,你必须考虑用于替换的数据类型。因此,如果A包含数字类型的数据和B字符类型的数据,则可以通过 df <- data.frame(A = NA_real_, B = NA_character_, ID = c(3,
有什么方法可以做到这一点吗?这个问题似乎很简单,但在回答时需要考虑不同的方面 OP询问了如何替换与给定
ID
值匹配的行中特定列中的值
数据类型
首先,你必须考虑用于替换的数据类型。因此,如果A
包含数字类型的数据和B
字符类型的数据,则可以通过
df <- data.frame(A = NA_real_,
B = NA_character_,
ID = c(3,6,8,9,27),
stringsAsFactors = FALSE)
df
这将避免昂贵的类型转换。参数stringsAsFactors=FALSE
将避免由于错误的因子级别而导致的错误
基尔
如前所述,其中(df$ID==8)
返回行号。因此,一个完整的答案是:
df[which(df$ID == 8), "A"] <- 0.7
df
使用键入的数据表
在data.table上设置键将进一步加快对特定ID
的搜索,代码将变得更加简洁:
setkey(dt, ID)
dt[.(8), A := 0.7][]
输出与上面显示的相同
使用查找表一次替换多个值
如果一列中有许多值要替换,则将它们存储在查找表中并在连接更新操作中使用可能会更有效:
lookupA <- data.table(ID = c(8, 3),
new = c(0.7, 1.2))
lookupA
最好是NA而不是NULL,谢谢你的评论。如果很容易解释-为什么?在R中,
NULL
是一个空对象,而缺少的观察值则希望用NA
表示,表示不存在的东西。不存在的东西!=空的物体。此外,NA
可以很容易地强制转换为其他向量类型,并且由于它是一个逻辑常量,因此有许多函数可以帮助操作它们。你能澄清你所说的X是什么意思吗?你是说索引位置吗?好的,谢谢。我想我明白了。我想做的是:填充NAs。例如,我确实知道,对于ID8,变量A是0.7。我如何告诉R分配df[3,1]也许我可以用另一种方式:我如何问R,在哪一行ID=8?
str(df)
'data.frame': 5 obs. of 3 variables:
$ A : num NA NA NA NA NA
$ B : chr NA NA NA NA ...
$ ID: num 3 6 8 9 27
df[which(df$ID == 8), "A"] <- 0.7
df
A B ID
1 NA <NA> 3
2 NA <NA> 6
3 0.7 <NA> 8
4 NA <NA> 9
5 NA <NA> 27
library(data.table)
dt <- as.data.table(df) # creating a copy of df for illustration
# replacement in place in rows given by row number
dt[which(ID == 8), A := 0.7][]
# replacement in place in rows given by condition
dt[ID == 8, A := 0.7][]
A B ID
1: NA NA 3
2: NA NA 6
3: 0.7 NA 8
4: NA NA 9
5: NA NA 27
setkey(dt, ID)
dt[.(8), A := 0.7][]
lookupA <- data.table(ID = c(8, 3),
new = c(0.7, 1.2))
lookupA
ID new
1: 8 0.7
2: 3 1.2
dt[lookupA, on = "ID", A := new][]
A B ID
1: 1.2 NA 3
2: NA NA 6
3: 0.7 NA 8
4: NA NA 9
5: NA NA 27