Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据ID在data.frame中寻址单元格_R_Dataframe - Fatal编程技术网

根据ID在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,

我在R中有一个data.frame。它看起来像这样(但要大得多):


有什么方法可以做到这一点吗?

这个问题似乎很简单,但在回答时需要考虑不同的方面

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